我试图在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,但它没有回答我的问题。
答案 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调用。