【问题标题】:Why does the following JQuery Ajax call result in a script error in IE9?为什么以下 JQuery Ajax 调用会导致 IE9 中出现脚本错误?
【发布时间】:2011-04-28 09:32:41
【问题描述】:

我进行以下 JQuery(v1.5.1) Ajax 调用:

function testAjaxCall()
{
  $.ajax(
    {
        url: "/Search.ashx?",
        dataType: "json"
    });
}

此调用返回以下 JSON 结果:

{ "objectData" : "100" }

但在 IE9 中它失败并出现以下错误(在其他浏览器中运行良好):

SCRIPT1004:应为“;” debug.finance.com,第 1 行字符 16

如果我删除 dataType:json 参数,则调用成功。知道有什么问题吗?我假设我的 JSON 不正确,但我通过验证器传递了它,它没有报告任何错误。

请帮忙!

编辑:(更详细)

我在 ASP.NET HTTP 处理程序中从服务器输出 JSON,如下所示:

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "application/json";
    context.Response.Write("{ \"objectData\" : \"100\" }");
    return;
}

【问题讨论】:

  • 是您的 js 所在的位置:debug.fin24.com,因为这是错误的来源
  • 你试过强制执行严格的 json 吗?在哪里为 data: 中的所有内容添加 " ?像这样"culture": "af", "queryString": "naspers", "pageSize": 10, "pageIndex": 0 ?
  • 恐怕那是主页并且在那一行包含“Doctype”。所以我假设这行 nr 可能是指在某处执行的动态脚本。
  • 谢谢 ianace。不幸的是没有变化:(

标签: json jquery internet-explorer-9


【解决方案1】:

您是在服务器端脚本中使用 JSON 编码还是自己“构建”它?

当我第一次开始摆弄 JSON 时,我错误地认为您可以构建一个字符串,包括大括号和方括号、冒号等。当我使用浏览器开发工具检查 XHR 时,一切看起来都很好,除了收到的是字符串而不是对象。

然后我了解到您可以在服务器端获取数据并使用(例如在 php 中) json_encode() 对您的数据进行编码,然后您可以像在此处所做的那样使用 JQUERY 数据类型 JSON 来解析返回的 Javascript 对象。

这不是完全相同的问题,但我的问题 here 应该提供更多关于发生了什么的背景信息。

【讨论】:

  • 我确实在服务器端手动构建了我的 JSON。我使用 ASP.NET 并对 Http 上下文执行 Response.Write。我会看看你的帖子,谢谢。
  • 我不熟悉 ASP .net,但我希望有一个标准的编码功能,尝试找到它 - 如果您的手工构建的 JSON 没有格式化,它将为您节省大量的调试时间正确 - 你知道它非常敏感;)。我忘记提到的一件事是关于设置标题文本类型的答案中的第三点也很重要。
  • 我尝试使用 JSON.Net,这显然非常好。最后,我得到了类似的 JSON,但我仍然必须将其作为字符串返回。棘手。所以还没有运气。我正在下载 JQuery 源代码以尝试查明错误...
  • 再次查看您的代码,您似乎只是在用context.Response.Write("{ \"objectData\" : \"100\" }"); 编写一个字符串。在这种情况下,它将不起作用,因为它必须返回和对象。 JQUERY 然后期望解析对象,但是因为它已经接收到一个字符串,它会发出一个错误。让我以另一种方式解释它context.Response.Write 正在写回一个字符串作为响应,它没有对其进行编码并将编码的对象发回。您有大括号这一事实不会使数据“编码”。
【解决方案2】:

感谢这篇(有点不相关的)帖子,我发现了问题所在:jQuery 1.5 AJAX call fails with "invalid label" for JSON requests

罪魁祸首是 jquery.validate,它与 JQuery v1.5 不是 100% 兼容。一旦我删除它,IE9 就可以完美运行!

我升级到 jquery.validate v1.8,现在一切正常。

【讨论】:

    【解决方案3】:

    这里的根本问题是 IE9 不支持 JSON over AJAX。相反,对于该浏览器,您需要使用 JSON-P。

    见:JavaScript: How do I create JSONP?

    在客户端,改变dataType如下:

    // Fall back to JSON-P for IE9 and lower:
    dataType: (('withCredentials' in new XMLHttpRequest ()) ? 'json' : 'jsonp'),        
    

    在服务器端,就在您发出 JSON 之前,请执行以下操作:

    // In JSON-P mode, wrap the JSON with the callback name and brackets:
    if (isSet ($_GET['callback']) && preg_match ('/^([_a-zA-Z0-9])$/', $_GET['callback']) ) {
        $json = $_GET['callback'] . '(' . $json . ');';
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多