【问题标题】:callback function doesn't work when using getJSON function in jQuery在jQuery中使用getJSON函数时回调函数不起作用
【发布时间】:2010-10-20 16:49:11
【问题描述】:

我正在尝试使用 jQuery 中的 getJSON 函数来导入一些数据并触发回调函数。回调函数不运行。但是,如果我用 get 函数尝试同样的事情,它就可以正常工作。奇怪的是,即使我将“json”作为类型传递,它也可以与 get 函数一起使用。为什么会这样?我在 Firefox 3 和 IE 7 中测试了以下文件:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<title>ajax test</title>
<script type="text/javascript" src="/jquery-1.3.2.min.js"></script>
</head>
<body>
<input type="button" id="test1" value="get">
<input type="button" id="test2" value="getJSON">
<input type="button" id="test3" value="get with json type">
<script type="text/javascript">
$("#test1").click(function() {
    $.get("index.html",
        function(response) {
            alert('hi');
            //works
        }
    )
});

$("#test2").click(function() {
    $.getJSON("index.html",
        function(response) {
            alert('hi');
            //doesn't work
        }
    )
});

$("#test3").click(function() {
    $.get("index.html",
        function(response) {
            alert('hi');
            //works
        },
        "json"
    )
});
</script>
</body></html>

无论我访问什么 URL,只要它位于同一个域中,这似乎都会发生。我尝试传递一些数据,但这并没有什么不同。

当然,我可以像在第三个测试函数中那样使用 get 函数来解决这个问题,但我仍然很好奇为什么会发生这种情况。

我知道这里有人问过similar question,但它没有回答我的问题。

【问题讨论】:

  • 会不会是json格式不好?
  • 也许我应该更清楚。 index.html 是我在上面发布的文件。我只是想访问文档本身,这不是最有用的东西。我只是把它放在那里,因为它简单方便。同样,我为 URL 输入的内容似乎并不重要。 json需要有效吗?
  • 问json是否需要有效可能听起来很傻,但如果需要,为什么即使没有有效的json,第三个测试函数也能工作?
  • 尝试使用一些有效的json来测试,看看会发生什么。

标签: javascript jquery ajax


【解决方案1】:

json需要有效,否则回调不会触发。

【讨论】:

  • 感谢您的快速响应。
  • 确实,Firefox 和 IE 对无效 JSON 的反应不同
  • 这是一件令人难以置信的事情——为什么它会默默地失败?但这绝对是真的。 jsonlint.com 是一个很好的验证器。
【解决方案2】:

$.getJSON() 是 JSONP,所以这样改:

$("#test2").click(function() {
    $.getJSON("index.html?callback=?",
        function(response) {
                alert('hi');
        }
    )
});

服务器接收到参数回调,其中包含以下内容:jsonp1291077863309。 在响应中写回回调函数 jsonp1291077863309(PUT_JSON_HERE)。

【讨论】:

    【解决方案3】:

    对!经过 2 天的疯狂尝试让 $.getJSON 接受来自服务器的格式正确的 JSON 字符串,问题真的出在服务器上!正如 Carl_Platt 所说,您必须将作为 url 参数接收的回调值添加到 json 输出(PHP 中的$_GET['callback'])。这就是所谓的“JSON-P 输出”,以防万一你想用谷歌搜索一下。

    动手,这里是他们展示 PHP 解决方案的页面:

    http://1080d.com/lang/en-us/2009/10/converting-php-to-jsonp-with-json_encode/

    记住(非常重要)添加到您调用callback=? 参数的url! (仅当您调用的 url 不在为执行 jquery 脚本提供服务的同一服务器中时才需要)...

    JQuery 会自动替换 '?'在将其发送到服务器之前使用方便的值。您无需担心使用了哪个值,这一切对您来说都是无缝的(如果服务器完成了正确的工作!这就是我的问题!):-)

    希望对你有帮助!

    【讨论】:

    • 非常感谢!对我来说幸运的是,我已经有几天没有尝试了,但至少有几个小时,而这正是我需要做的来解决它!
    【解决方案4】:

    在表面之下,当您致电 getJSON 时,会发生以下情况:

    // ~ line 3216
    getJSON: function( url, data, callback ) {
        return jQuery.get(url, data, callback, "json");
    }, // ... rest of jQuery core
    

    所以一定有其他东西阻止回调触发......

    我会首先在每个回调中 **alert**ing 不同 事物(不仅仅是“嗨”),这样您就知道哪个失败/成功了。

    【讨论】:

      【解决方案5】:

      正如许多其他人所提到的,您需要有效的 JSON(即符合 http://json.org/ 的规则)才能使 getJSON 工作(这意味着您无法像示例中那样通过 getJSON 获取 HTML)。

      最后一个测试有效的原因是因为最后一个参数“json”没有被解释为“type”。因为以下不起作用:

      $("#test3").click(function() {
          $.get("index.html",
              '',
              function(response) {
                      alert('hi');
                      //works
              },
              "json"
          )
      });
      

      【讨论】:

        【解决方案6】:

        尽管有格式良好的 JSON 等,但我遇到了同样的问题。我能够查询我的 web 服务并获得响应,但是,我的回调函数没有触发。在搜索网络之后,我大多数互联网用户都建议使用“jsonp”,因为我的应用程序执行了一些跨域调用,并且还添加了“回调?”,所以我这样做了。到我的网址。这不起作用,但包含返回 JSON 的回调解决了我的问题。下面的代码解释了我的意思:

        //server side json formed somewhere up here
        String data = callback + "("+ json +")" ;
        

        由此产生的响应类似于“jsonp1280403476086([{"Name":"Jack Sparrow” 哪个 jQuery 似乎没有问题,所以从来没有死在我身上。

        希望这会有所帮助。

        【讨论】:

          【解决方案7】:

          在MVC2中使用$.post而不是$.getJSON(),如果你使用$.getJSON$.get,请务必将JsonRequestBehavior设置为AllowGet。否则这将返回 HTML 错误,导致您的请求不触发回调。

          【讨论】:

            【解决方案8】:

            确保您的控制器中的 JsonResult 方法上方没有列出 [HttpPost]。这不会将数据返回给 .getJSON 调用。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-12-16
              • 1970-01-01
              • 2010-11-08
              • 2013-01-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多