我在 JSON 跨域策略问题上遇到了困难。经过一些实验后,我能够让这段代码工作,但我遇到了这样一种情况,我有两段代码,它们看起来应该完全相同,但只有一个有效。
我正在访问的 JSON 在这里
http://www.aph.com/files/partners/aphnonstopproducts/json/aphnonstopproductsjson.json
这个文件看起来是简单的 JSONP:它不带任何参数,并且 JSON 填充了一个名为 jsonCallBack 的函数调用。它似乎是有效的 JSON。
这是我尝试用来获取此 JSON 数据的第一组代码:
$.getJSON("http://www.aph.com/files/partners/aphnonstopproducts/json/aphnonstopproductsjson.json?callback=jsonCallback", function (data) {
//This will not alert
alert(data.APHNonStopProducts.Carpark[0].Airport.airportcode);
});
我的理解是,您可以将 替换为callback=?
函数包装器的名称,以便将该数据传递给匿名函数。此代码在 Chrome 开发工具中显示以下错误:
XMLHttpRequest 无法加载 http://www.aph.com/files/partners/aphnonstopproducts/json/aphnonstopproductsjson.json?callback=jsonCallback。Access-Control-Allow-Origin 不允许来源http://fiddle.jshell.net 。
值得注意的是,如果保留 URLaphnonstopproductsjson.json?callback=?
并在我的代码中存在一个命名函数,那么数据将被正确检索并调用命名函数(尽管匿名函数仍然不是)
这是第二个代码,它有效:
$.ajax({
url: "http://www.aph.com/files/partners/aphnonstopproducts/json/aphnonstopproductsjson.json?callback=?",
dataType: 'json',
jsonp : "callback",
jsonpCallback: "jsonCallback",
success: function(data) {
//This alert will fire
alert(data.APHNonStopProducts.Carpark[0].Airport.airportcode);
}
});
});
在此调用中,我指定参数名称应为回调,函数名称应为 jsonCallback。所以本质上,这和第一个代码不一样吗?如果是这样,为什么第一个代码会失败?
在此处查看两段代码:http: //jsfiddle.net/3EXca/(您应该收到一条显示“ABZ”的警报)