应该是非常简单的Jquery jsonp



为什么这不起作用?任何人:

在我的代码中,我有:

$.getJSON("http://isp123.co.uk/cw/NorthWales/Test.txt?jsoncallback=?",
        function(data){
                //This never gets executed
            alert('here');
          });

文本文件可以在这里查看:

http://isp123.co.uk/cw/NorthWales/Test.txt

这不是JSONP响应:

({"name" : "hello world"});

如果您有一个正确的JSONP响应,那么您的代码应该可以工作。

在发出请求之前,jQuery更改了URL"callback=?"部分的问号,您的JSONP服务器需要能够动态创建JSONP"函数"以响应唯一的jQuery请求。如果不能动态创建JSONP,也许可以使用YQL/Yahoo管道将其转换为JSONP?

这个管道应该完成任务,看看它是否有效,在getJSON函数中使用这个URL:http://pipes.yahoo.com/pipes/pipe.run?u=http%3A%2F%2Fisp123.co.uk%2Fcw%2FNorthWales%2FTest.txt&amp_id=332d9216d8910ba39e6c2577fd321a6a&amp_render=json&amp_callback=?

我刚试过这个,它奏效了:

$.getJSON("http://pipes.yahoo.com/pipes/pipe.run?u=http%3A%2F%2Fisp123.co.uk%2Fcw%2FNorthWales%2FTest.txt&_id=332d9216d8910ba39e6c2577fd321a6a&_render=json&_callback=?", function(data){
    //This always gets executed!!!
    alert('here');
});

我不知道你是否对JSONP足够了解,但这不是JSONP

?({"name" : "hello world"});

真的应该是这样的http://isp123.co.uk/cw/NorthWales/Test.txt?jsoncallback=foo

foo({"name" : "hello world"});

从jQuery.getJson手册页面:

重要提示:从jQuery 1.4开始,如果JSON文件包含语法错误,请求通常会以静默方式失败。因此,避免频繁手动编辑JSON数据。JSON是一种数据交换格式,其语法规则比JavaScript的对象文字表示法更严格。例如,JSON中表示的所有字符串,无论是属性还是值,都必须用双引号括起来。有关JSON格式的详细信息,请参阅http://json.org/.

根据,您的JSON无效http://jsonlint.com/

这里明确提到

从jQuery 1.5开始,设置jsonp选项为false可防止jQuery将"?callback"字符串添加到URL或尝试使用"=?"转型在这种情况下还应显式设置jsonCallback设置

并读取jsonCallback部分

jsonCallback,

指定的回调函数名称JSONP请求。此值将为使用而不是随机名称由jQuery自动生成。它最好让jQuery生成唯一的名称,因为它将使管理请求并提供回调和错误处理。你可以希望在希望启用更好的浏览器缓存的GET请求。从jQuery 1.5开始,您也可以为此使用函数设置,在这种情况下jsonpCallback设置为返回函数的值

可能值得使用jQuery.ajax()-http://api.jquery.com/jQuery.ajax/

您可以将dataType作为"jsonp"传入,然后jQuery负责所有回调业务,但更重要的是,您可以指定一个函数在出现错误时运行,这可能会对您有所帮助:

$.ajax({
    dataType: "jsonp",
    success: function(d) {console.log(d);},
    error: function() { console.log("error") } //do your debugging in here
    //add other parameters such as URL, etc
});

您定义的error函数可以传递3个变量,请在jQuery文档的ajax()页面上阅读(链接在我文章的开头(,以了解更多信息以及如何使用它们。

您的问题在于服务器如何输出信息。在您提供的链接中,假设放置在?jsonpcallback中的任何名称都会导致将JSONP代码封装在具有相同名称的函数中。然而,事实并非如此。

因此,下一个选项是:在服务器文件中使用静态函数名并包装代码。(例如,使用foo(<jsonp>)并坚持使用它(然后,您必须明确地告诉jQuery,我们将使用一个特定的函数名称(让jQuery假设它提供(并因此接收(该名称,而实际上您只是在服务器端提供并填充空白(。

一旦你设置好了文件,就可以使用以下方法:

$.ajax({
  // setup the request
  url: 'http://isp123.co.uk/cw/NorthWales/Test.txt',
  crossDomain: true,
  dataType: 'jsonp',
  jsonp: false,
  jsonpCallback: 'foo', // "supply" the jsonp function (pseudo-defined)
  // function to call when completed
  complete: function(data){
    alert(data);
  }
  // just in case, catch the error
  error: function(j,t,e){
    alert('AJAX Error');
  }
});

因此,现在当jQuery进行调用,并且认为它提供了回调时,它实际上只是得到了服务器定义的回调作为回报。因此,为了使以上内容发挥作用,您的文本文件应该如下所示:

foo({name:"Hello, World!"});

此外,如果可以的话,将标题更改为application/javascript,尽管这是可选的。

最新更新