我有一个从外部网站加载的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
函数是唯一一个始终显示的函数。这是控制台:
挪威人说这个脚本请求CORS,它无法在Access-Control-Allow-Origin的头部找到原点,并且XMLHttpRequest有网络错误,并说“无法访问”。 / p>
出现这种情况的原因可能有以下几种:
1:新代码
有问题 2: .getJSON
jQuery函数(黑客?)中有什么可以防止错误发生
3:新代码中有一些我忘了添加的内容
4:我的浏览器有一些东西(目前是IE 11)
5:还有别的吗?
在这方面提供一些帮助会很可爱。
答案 0 :(得分:5)
这不是网络错误。这是一个跨源错误。请求成功,但浏览器拒绝访问您的JavaScript响应。
由于URL中有callback=?
,jQuery将生成JSONP请求而不是XMLHttpRequest请求。这将作为脚本执行响应,而不是读取原始数据。
您正在手动创建XMLHttpRequest,因此由于同源策略而失败。
答案 1 :(得分:0)
来自http://api.jquery.com/jquery.getjson/:
JSONP
如果URL包含字符串“callback =?”(或类似的,由服务器端API定义),则该请求将被视为JSONP。有关更多详细信息,请参阅$ .ajax()中有关jsonp数据类型的讨论。
你有一个回调。这意味着JQuery函数可以从XHR调用中请求来自其他域的数据。