我想从外部来源获得实时汇率,所以我找到了这个很棒的网络服务:
这项服务就像一个魅力,唯一的缺点是它不提供JSONP结果,只提供XML。因此,在尝试使用jQuery $ .ajax()来使用此Web服务时,我们遇到了跨浏览器问题。
所以我发现Yahoo Query Language以JSONP和mangae的形式返回结果以使用其他Web服务并返回结果。这也有效,这是一个示例URL:
http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D'http%3A%2F%2Fwww.webservicex.net%2FCurrencyConvertor.asmx%2FConversionRate%3FFromCurrency%3DNOK%26ToCurrency%3DEUR'&format=json&diagnostics=true&callback=cbfunc
此网址返回JSONP结果并且像魅力一样工作,但在我的代码中使用此问题时会出现问题:
$.ajax({
type: "GET",
url: urlToWebservice,
contentType: "application/json; charset=utf-8",
dataType: "jsonp",
success: function(data) {
$("#status").html("OK: " + data.text);
},
error: function(xhr, textStatus, errorThrown) {
$("#status").html("Unavailable: " + textStatus);
}
});
当我尝试运行此代码时,没有任何反应,我可以在我的Firebug javascript调试器中看到此错误消息:
cbfunc is not defined
cbfunc是围绕JSON响应的容器的名称,但为什么说没有定义?
修改
这是我的新代码,但我仍然得到cbfunc is not defined
$.ajax({
url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D'http%3A%2F%2Fwww.webservicex.net%2FCurrencyConvertor.asmx%2FConversionRate%3FFromCurrency%3DNOK%26ToCurrency%3DEUR'&format=json&callback=cbfunc",
dataType: 'jsonp',
jsonp: 'callback',
jsonpCallback: 'cbfunc'
});
function cbfunc(data) {
alert("OK");
}
并且“OK”消息永远不会被触发......
答案 0 :(得分:5)
如果可用,请在jsonpCallback
的调用中使用$.ajax
参数,如:
jsonpCallback: "cbfunc",
其描述来自jQuery API docs:
指定jsonp请求的回调函数名称。将使用此值代替jQuery自动生成的随机名称。
文档后来继续说:
最好让jQuery生成一个唯一的名称,因为它可以更容易地管理请求并提供回调和错误处理。如果要为GET请求启用更好的浏览器缓存,可能需要指定回调。
然而, 建议在使用YQL时使用这种“首选”行为。正是为什么这种方法不理想可能会使这个答案过于冗长,所以这里有一个链接(来自YQL博客),详细说明jQuery首选方法的问题,利用jsonpCallback
等等:{{3} }
答案 1 :(得分:2)
您应该让jQuery通过将urlToWebservice
更改为callback=?
答案 2 :(得分:2)
它不起作用的原因是因为通过在查询字符串中指定callback=cbfunc
会生成类型的URL:
http://query.yahooapis.com/...&callback=cbfunc&callback=jsonp1277417828303
删除了所有不感兴趣的部分,但该网址包含两个callback
个参数。其中一个是由jQuery管理的,另一个不是。 YQL只查看第一个callback
参数,并返回一个响应该参数。
cbfunc({"query":{...}});
但是,脚本中没有名为cbfunc
的函数,因此这就是您收到未定义错误的原因。 jQuery在上面的例子中创建了一个名为jsonp1277417828303
的隐式函数,而YQL的响应应该是:
jsonp1277417828303({"query":{...}});
让jQuery对其采取行动,并将响应返回到你永远不会做的success
回调。
因此,正如@SLaks建议的那样,从您的网址中删除&callback=cbfunc
,或将其替换为&callback=?
以让jQuery处理事情。
答案 3 :(得分:1)
你一定要试试jQuery-JSONP:http://code.google.com/p/jquery-jsonp/
简化一切:)