【问题标题】:jQuery .getJSON Firefox 3 Syntax Error UndefinedjQuery .getJSON Firefox 3 语法错误未定义
【发布时间】:2010-09-25 00:36:34
【问题描述】:

运行此代码时,我在 Firefox 3 中遇到语法错误(未定义的第 1 行 test.js)。警报正常工作(它显示“工作”),但我不知道为什么会收到语法错误。

jQuery 代码:

$.getJSON("json/test.js", function(data) {
    alert(data[0].test);
});

test.js:

[{"test": "work"}]

有什么想法吗?我正在处理一个更大的 .js 文件,但我已将其缩小到此代码。疯狂的是,如果我用远程路径替换本地文件没有语法错误(这里是一个例子):

http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?

【问题讨论】:

  • 你能发一个测试用例吗?也不应该是 $.getJSON 吗?
  • 是的,抱歉打错了。我不确定您对测试用例的要求是什么?
  • 为什么要在 test.js 中返回一个数组?为什么不只是对象?

标签: javascript jquery html json firefox


【解决方案1】:

我找到了解决该错误的方法

$.ajaxSetup({'beforeSend': function(xhr){
    if (xhr.overrideMimeType)
        xhr.overrideMimeType("text/plain");
    }
});

现在解释: 在 firefox 3(我假设只有 firefox 3)中,每个 mime 类型为“text/xml”的文件都会被解析和语法检查。如果您以“[”开头的 JSON 将引发语法错误,如果它以“{”开头,则会引发“格式错误”(我对“nicht wohlgeformt”的翻译)。 如果我从本地脚本访问我的 json 文件 - 此进度中不包含任何服务器 - 我必须覆盖 mime-type...也许您为该文件设置错误的 MIME-Type...

不过,添加这段小代码可以让您避免出现错误消息

编辑: 在 jquery 1.5.1 或更高版本中,您可以使用 mimeType 选项来达到相同的效果。要将其设置为所有请求的默认值,请使用

$.ajaxSetup({ mimeType: "text/plain" });

您也可以直接将它与 $.ajax 一起使用,即您的调用转换为

$.ajax({
    url: "json/test.js",
    dataType: "json",
    mimeType: "textPlain",
    success: function(data){
        alert(data[0].test);
    } });

【讨论】:

  • 它也可以使用内容类型标头覆盖服务器端的内容类型
  • 彼得:谢谢,谢谢,谢谢!我遇到了这个问题(stackoverflow.com/questions/2618959/…),我在这里用你的回答解决了这个问题。我做了一个改变,那就是使用“application/json”而不是“text/plain”。
  • 在第二个示例中使用$.ajaxmimeType:'textPlain' 似乎对我不起作用,而mimeType:'text/plain' 对。
【解决方案2】:

getJSON 可能坚持使用至少一个名称:值对。
一个直数组["item0","item1","Item2"] 是有效的 JSON,但在 getJSON 的回调函数中没有任何东西可以引用它。

在这个邮政编码的小数组中:

{"result":[["43001","ALEXANDRIA"],["43002","AMLIN"],["43003","ASHLEY"],["43004","BLACKLICK"],["43005","BLADENSBURG"],["43006","BRINKHAVEN"]]}

...在添加 {"result": 标签之前,我一直卡住。之后我可以参考它:

<script>
       $.getJSON("temp_test_json.php","",
        function(data) {
            $.each(data.result, function(i, item) {
                alert(item[0]+ " " + i);
                if (i > 4 ) return false;
              });
        });
</script>

...我还发现使用 $.each() 更容易。

【讨论】:

    【解决方案3】:

    这听起来可能真的很愚蠢,但是将 test.js 的文件扩展名从 .js 更改为 .txt。我在完全有效的 JSON 数据文件中发生了同样的事情,除了 .txt 之外的任何扩展名(例如:.json、.i18n)。由于我更改了扩展程序,因此我可以很好地获取数据并使用它。

    就像我说的,这可能听起来很愚蠢,但它对我有用。

    【讨论】:

    • 尝试更改为 .txt 扩展名,但它仍然给我错误。我能够获取所有数据但收到错误。幸运的是,当放置在实际的 Web 服务器上(而不是在本地运行)时,它可以正常工作(没有错误)。
    【解决方案4】:

    在我的本地 PC 上测试网页时,我遇到了同样的错误,但是一旦它在托管服务器上启动,该错误就不再发生了。抱歉 - 我不知道原因,但认为这可能有助于其他人追查原因

    【讨论】:

      【解决方案5】:

      尝试将“test.js”重命名为“test.json”,这就是Wikipedia 所说的 JSON 文件的官方扩展名。也许它在某个时候被作为 Javascript 处理。

      【讨论】:

      • 不,没有这样做。相同的语法错误(未定义的第 1 行 test.json)
      【解决方案6】:

      您是否尝试过禁用所有 Firefox 扩展?

      我通常会在 Firebug 控制台中遇到一些由扩展引起的错误,而不是由所访问的网站引起的。

      【讨论】:

      • 是的,我已经尝试禁用所有加载项,但仍然通过错误控制台收到错误。
      【解决方案7】:

      检查test.js 末尾是否有;。 jQuery 执行eval("(" + data + ")"),分号会阻止 Firefox 找到右括号。并且可能还有其他一些看不见的字符会阻止它这样做。

      我可以告诉你为什么这个远程位置可以工作,因为它以完全不同的方式执行。由于它有jsoncallback=? 作为查询参数的一部分,jQuery 将其视为JSONP,并实际上将其插入到&lt;script&gt; 标签内的DOM 中。尝试使用"json/test.js?callback=?" 作为目标,它也可能有帮助。

      【讨论】:

        【解决方案8】:

        您在哪种网络服务器上运行它?我曾经在 IIS 上读取 JSON 文件时遇到问题,因为它没有被定义为有效的 MIME 类型。

        【讨论】:

          【解决方案9】:

          尝试配置 .js 文件的内容类型。显然,Firefox 期望它是文本/纯文本。您可以像上面的 Peter Hoffmann 那样做,也可以设置内容类型标头服务器端。

          这可能意味着服务器端配置更改(如 apache 的 mime.types 文件),或者如果 json 是从脚本提供的,则在脚本中设置 content-type 标头。

          或者至少这似乎让我的错误消失了。

          【讨论】:

            【解决方案10】:

            我遇到了类似的问题,但正在循环一个 for 循环。我认为问题可能是索引超出范围。

            • 基恩

            【讨论】:

              【解决方案11】:

              不使用jQuery的人,发送请求前需要调用overrideMimeType方法:

              var r = new XMLHttpRequest();
              r.open("GET", filepath, true);
              r.overrideMimeType("text/plain");
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2010-11-29
                • 2020-06-30
                • 2013-08-19
                • 2012-05-23
                • 1970-01-01
                • 2019-05-28
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多