jQuery .getJSON Firefox 3 语法错误未定义

10

当我运行这段代码时,在Firefox 3中出现语法错误(未定义的第1行test.js)。警告框可以正常工作(显示“work”),但我不知道为什么会收到语法错误。

jQuery代码:

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

测试文件.js:

[{"test": "work"}]

有任何想法吗?我正在为一个更大的.js文件工作,但我已将其缩小到这段代码。疯狂的是,如果我用远程路径替换本地文件,就不会出现语法错误(这里是一个例子):

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


你能发布一个测试用例吗?另外,那不应该是$.getJSON吗? - Greg
抱歉打错字了。我不确定你在测试用例中想要什么? - Mike
为什么在test.js中返回一个数组?为什么不只返回对象呢? - James
11个回答

23
我找到了解决那个错误的方法。
$.ajaxSetup({'beforeSend': function(xhr){
    if (xhr.overrideMimeType)
        xhr.overrideMimeType("text/plain");
    }
});

现在解释一下: 在Firefox 3中(我认为仅限于Firefox THREE),每个具有“text/xml” MIME类型的文件都会被解析和语法检查。如果您以“[”开头,则会引发语法错误,如果以“{”开头,则是“Malformed Error”(我翻译为“不良形式”)。 如果我从本地脚本访问我的JSON文件-此过程中未包含服务器-我必须覆盖MIME类型...也许您错误地设置了该文件的MIME类型...

无论如何,添加这段小代码将使您免受错误消息的困扰

编辑:在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);
    } });

1
还可以通过在服务器端使用content-type头来覆盖内容类型。 - Ian McLaird
Peter:非常感谢,感谢,感谢!我遇到了这个问题(https://dev59.com/HHE85IYBdhLWcg3wx2j2),但是通过你在这里的回答解决了它。我只做了一个更改,就是使用“application/json”而不是“text/plain”。 - Ryan
1
在你的第二个例子中使用 $.ajaxmimeType:'textPlain' 对我来说似乎不起作用,而 mimeType:'text/plain' 则可以。 - shennan

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()更加简单。


1

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


1
这可能听起来非常愚蠢,但将test.js的文件扩展名从.js更改为.txt。我曾经遇到过完全有效的JSON数据文件,几乎任何扩展名都可以,除了.txt(例如:.json,.i18n)。自从我更改了扩展名以后,我就可以正常获取并使用数据了。
就像我说的那样,这可能听起来很傻,但对我有用。

尝试更改为 .txt 扩展名,但仍然出现错误。我能够获取所有数据,但是收到了错误信息。幸运的是,当放置在实际的 Web 服务器上(而不是本地运行)时,它可以正常工作(没有错误)。 - Mike

0

我曾经遇到过类似的问题,但是当时是在一个for循环中。我认为问题可能是索引越界了。

  • Kien

0
尝试将 "test.js" 重命名为 "test.json",这是Wikipedia所说的 JSON 文件的官方扩展名。也许在某个时候它被处理成了 JavaScript。

不行,这并没有解决问题。还是同样的语法错误(未定义行1 test.json)。 - Mike

0
你尝试过禁用所有的Firefox扩展程序吗?
我通常会在Firebug控制台中得到一些错误,这些错误是由扩展程序引起的,而不是被访问的网站引起的。

1
是的,我已经尝试禁用所有附加组件,但仍然通过错误控制台收到错误。 - Mike

0

尝试配置.js文件的内容类型。 显然,Firefox希望它是text/plain。 您可以像Peter Hoffmann一样这样做,也可以在服务器端设置内容类型标头。

这可能意味着需要进行服务器端配置更改(例如Apache的mime.types文件),或者如果json来自脚本,则在脚本中设置content-type头。

或者至少对我来说,似乎已经消除了这个错误。


0

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

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


0
你正在使用什么类型的Web服务器? 我曾经在IIS上读取JSON文件时遇到问题,因为它没有被定义为有效的MIME类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接