我试图用getJSON方法获取json值。
var myurl = 'http://otherdomain.com/api.json?value=something&callback=?';
$.getJSON(myurl,function(data){
console.log('successful!');
}).error(function(){
console.log('Error message: ' + e.statusText);
});
最终结果是:错误消息:成功而不是json数据,尽管网络响应确实在开发者控制台中显示 json数据。例如。回复数据:
[{ “第一”: “约翰”, “FirstLength”:[4], “上次”: “Doe的”, “LastLength”:[3]}]
如果我直接从浏览器打开链接,它会正常加载。
如果我删除& callback =?我收到这条消息:
XMLHttpRequest无法加载http://otherdomain.com/api.json?value=something。 Access-Control-Allow-Origin不允许原点http://localhost。
我还有哪些其他选择可以避免此问题?感谢
答案 0 :(得分:1)
我最初回答了这个问题,认为由于第二个'?'而导致网址无效字符。由于吸引了否定投票,我意识到我的错误,这是使用JQuery随机生成的回调函数名称的标准JSONP语法。
所以我做了一些研究来弥补我原来的naff帖子并为你提供一些想法。
您提到的回复数据[{"First":"John","FirstLength":[4],"Last":"Doe","LastLength":[3]}]
来自我所看到的valid JSON。但是根据这篇关于Bug with json4j的帖子,看起来有些库可能会以sqaure括号开始处理你的响应。如果删除前导和尾随方括号,以便将单个javascript对象返回到回调函数而不是数组,问题是否会消失?
从阅读以下两篇优秀帖子看起来你没有得到你通常会得到的标准JQuery错误处理(正如你所描述的)
因为JSONP依赖于脚本标记,所以它不使用底层HTTPRequest对象的回调功能。这意味着当您使用JSONP时,$ .ajax()方法上的成功,失败,完整回调函数无关紧要且无法正常运行。
http://www.ibm.com/developerworks/library/wa-aj-jsonp1/
首先,JSONP调用没有错误处理。如果动态脚本插入有效,则会调用;如果没有,没有任何反应。它只是默默无闻。
从这些帖子中,我的另一个建议是试图明确将dataType作为JSONP返回。 JQuery的$.ajax
可能与$.json
的行为不同。所以尝试使用像这样的显式回调函数......
$.ajax({
url: surl,
data: {id: id},
dataType: "jsonp",
jsonp : "callback",
jsonpCallback: "jsonpcallback"
});
这最后的建议要求JQuery 1.4 +
答案 1 :(得分:0)
我可能在这里错了...但是你知道你正在调用jQuery.error method ...就像你在抛出一条错误消息而不是在你的getJson上处理错误回调一样。
答案 2 :(得分:0)
会是这样的:
function fetch_feed(url){
var newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.src = url;
jQuery('body').append(newScript);
}
function successMethod(data){
console.log('successful!');
}
fetch_feed("http://otherdomain.com/api.json?value=something&callback=successMethod");