应该是非常简单的Jquery jsonp

时间:2011-07-06 14:53:44

标签: javascript 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

6 个答案:

答案 0 :(得分:2)

这不是JSONP响应:

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

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

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

This pipe应该诀窍,看它是否有效,在getJSON函数中使用此URL:http://pipes.yahoo.com/pipes/pipe.run?u=http%3A%2F%2Fisp123.co.uk%2Fcw%2FNorthWales%2FTest.txt&_id=332d9216d8910ba39e6c2577fd321a6a&_render=json&_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');
});

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

jQuery.getJson手册页:

  

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

根据http://jsonlint.com/

,您的JSON无效

答案 3 :(得分:0)

Here明确提到

  

从jQuery 1.5开始,设置jsonp   选项为false可防止jQuery   将“?callback”字符串添加到   网址或尝试使用“=?”对于   转型。在这种情况下,你   还应该明确设置   jsonpCallback设置

并阅读jsonpCallback部分

jsonpCallback,

  

指定回调函数名称   一个JSONP请求。这个值将是   用来代替随机名称   由jQuery自动生成。它   最好让jQuery生成一个   独特的名称,因为它会使它更容易   管理请求并提供   回调和错误处理。你可以   想要在你指定回调时   想要启用更好的浏览器缓存   GET请求。从jQuery 1.5开始,你   也可以使用一个函数   设置,在这种情况下的值   jsonpCallback设置为return   该函数的值

答案 4 :(得分:0)

可能值得使用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()页面上读取(在我的帖子开头链接),以了解有关它的更多信息如何使用它们。

答案 5 :(得分:0)

您的问题在于您的服务器如何输出信息。在您提供的链接中,假设?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,尽管这是可选的。