Mar*_*tin 4 javascript jquery json jsonp web-services
我想从外部来源获得实时汇率,所以我找到了这个很棒的网络服务:
这项服务就像一个魅力,唯一的缺点是它不提供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
Run Code Online (Sandbox Code Playgroud)
这个URL返回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);
}
});
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此代码时没有任何反应,我可以在我的Firebug javascript调试器中看到此错误消息:
cbfunc is not defined
Run Code Online (Sandbox Code Playgroud)
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");
}
Run Code Online (Sandbox Code Playgroud)
并且"OK"消息永远不会被触发......
如果可用,请使用jsonpCallback调用中的参数$.ajax:
jsonpCallback: "cbfunc",
Run Code Online (Sandbox Code Playgroud)
它的描述来自jQuery API文档,内容如下:
指定jsonp请求的回调函数名称.将使用此值代替jQuery自动生成的随机名称.
文档后来继续说:
最好让jQuery生成一个唯一的名称,因为它可以更容易地管理请求并提供回调和错误处理.如果要为GET请求启用更好的浏览器缓存,可能需要指定回调.
但是,在使用YQL时,不建议使用这种"优选"行为.正是为什么这种方法不理想可能会使这个答案过于冗长,所以这里有一个链接(来自YQL博客)详细说明jQuery首选方法的问题,利用jsonpCallback等等:避免速率限制并在YQL中被禁止管道:缓存是你的朋友
| 归档时间: |
|
| 查看次数: |
6240 次 |
| 最近记录: |