【问题标题】:Should be really simple Jquery jsonp应该是非常简单的 Jquery jsonp
【发布时间】:2011-07-06 23:44:30
【问题描述】:

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

在我的代码中:

$.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

【问题讨论】:

  • 一方面,使用http://isp123.co.uk/cw/NorthWales/Test.txt?jsoncallback=a 不会导致它将jsonp 包装在a() 方法调用中。尝试绑定到$.ajaxError 或使用$.ajax 调用并提供error 选项。
  • 你用的是什么版本的jQuery?
  • 你试过alert(data.name)

标签: javascript jquery jsonp


【解决方案1】:

这不是 JSONP 响应:

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

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

“callback=?”中的问号部分 URL 在发出请求之前由 jQuery 更改,您的 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');
});

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    【解决方案3】:

    来自jQuery.getJson 手册页:

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

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

    【讨论】:

    • 使用最新版本的 JQuery 1.6.2
    • @user831839:此行为是在 1.4 版中添加的,因此它会出现在您的版本中。您应该尝试修复 JSON 以查看是否可以缓解问题。
    【解决方案4】:

    Here明确提到

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

    并阅读 jsonpCallback 部分

    jsonpCallback,

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

    【讨论】:

      【解决方案5】:

      可能值得使用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() 页面上阅读它以了解更多信息以及如何使用它们.

      【讨论】:

      • 虽然我同意使用$.ajax,但问题似乎出在服务器上。 GET 变量与信息输出无关(当 jsonpcallback 实际上应该导致将提供的变量放置在输出本身中时)。
      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-12
        • 1970-01-01
        • 1970-01-01
        • 2016-06-29
        • 2012-10-17
        • 1970-01-01
        • 2011-08-25
        相关资源
        最近更新 更多