在jQuery中使用getJSON函数时,回调函数不起作用

时间:2009-04-20 22:36:59

标签: javascript jquery ajax

我试图在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函数解决问题,就像我在第3次测试函数中所做的那样,但我仍然很好奇为什么会发生这种情况。

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

8 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:4)

$。getJSON()是JSONP,所以改变它:

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

服务器接收填充了以下内容的param回调:jsonp1291077863309。 在响应中写回回函数jsonp1291077863309(PUT_JSON_HERE)。

答案 2 :(得分: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不在服务执行jquery脚本的同一服务器中时才需要)...

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

希望它有所帮助!

答案 3 :(得分:0)

在表面上,当您致电 getJSON 时,就会发生这种情况:

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

所以必须有其他一些阻止回调的事情......

我会在每个回调中以** alert ** 不同的事物(不仅仅是'hi')开始,这样你就知道哪一个失败/成功了。

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

我有同样的问题,尽管有很好的JSON等。我能够查询我的webservice,并获得响应,但是,我的回调函数没有触发。在搜索网后,我大多数互联网建议使用'jsonp',这是我自从我的应用程序执行一些跨域调用以来,并且还添加了'回调?'到我的网址。这不起作用,但包括返回JSON的回调解决了我的问题。下面的代码解释了我的意思:

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

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

希望这有帮助。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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