jQuery + JSONP + Yahoo查询语言

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"消息永远不会被触发......

sal*_*the 5

如果可用,请使用jsonpCallback调用中的参数$.ajax:

 jsonpCallback: "cbfunc",
Run Code Online (Sandbox Code Playgroud)

它的描述来自jQuery API文档,内容如下:

指定jsonp请求的回调函数名称.将使用此值代替jQuery自动生成的随机名称.

文档后来继续说:

最好让jQuery生成一个唯一的名称,因为它可以更容易地管理请求并提供回调和错误处理.如果要为GET请求启用更好的浏览器缓存,可能需要指定回调.

但是,在使用YQL时,建议使用这种"优选"行为.正是为什么这种方法不理想可能会使这个答案过于冗长,所以这里有一个链接(来自YQL博客)详细说明jQuery首选方法的问题,利用jsonpCallback等等:避免速率限制并在YQL中被禁止管道:缓存是你的朋友