XMLHttpRequest()JSON抛出网络错误,但类似的jQuery .getJSON代码有效

时间:2014-12-10 20:32:56

标签: javascript jquery ajax json

我有一个从外部网站加载的JSON脚本。在最简单的形式中,代码就像这样(并且正在工作):

jQuery.getJSON("http://adressesok.posten.no/api/v1/postal_codes.json?postal_code=" + document.querySelector("input").value + "&callback=?",
    function(data){
        document.querySelector("output").textContent = data.postal_codes[0].city;
    });

然而,网站所有者不希望jQuery如果它不重要,所以我将.getJSON重新编码为request = new XMLHttpRequest();模型:

request = new XMLHttpRequest();
request.open("GET", "http://adressesok.posten.no/api/v1/postal_codes.json?postal_code=" + document.querySelector("input").value + "&callback=?", true);
request.onload = function() {
    var data = JSON.parse(request.responseText);
    document.querySelector("output").textContent = data.postal_codes[0].city; 
};
request.onerror = function() { /* this gets called every time */ };

我已多次修改我的代码,一遍又一遍地阅读文档,但.onerror函数是唯一一个始终显示的函数。这是控制台:

Errors in IE11 console

挪威人说这个脚本请求CORS,它无法在Access-Control-Allow-Origin的头部找到原点,并且XMLHttpRequest有网络错误,并说“无法访问”。 / p>

出现这种情况的原因可能有以下几种:

1:新代码

有问题

2: .getJSON jQuery函数(黑客?)中有什么可以防止错误发生

3:新代码中有一些我忘了添加的内容

4:我的浏览器有一些东西(目前是IE 11)

5:还有别的吗?

在这方面提供一些帮助会很可爱。

DEMO:http://jsbin.com/muxigulegi/1/

2 个答案:

答案 0 :(得分:5)

这不是网络错误。这是一个跨源错误。请求成功,但浏览器拒绝访问您的JavaScript响应。

由于URL中有callback=?,jQuery将生成JSONP请求而不是XMLHttpRequest请求。这将作为脚本执行响应,而不是读取原始数据。

您正在手动创建XMLHttpRequest,因此由于同源策略而失败。

Create a JSONP request代替。

答案 1 :(得分:0)

来自http://api.jquery.com/jquery.getjson/

JSONP

如果URL包含字符串“callback =?”(或类似的,由服务器端API定义),则该请求将被视为JSONP。有关更多详细信息,请参阅$ .ajax()中有关jsonp数据类型的讨论。

你有一个回调。这意味着JQuery函数可以从XHR调用中请求来自其他域的数据。