在jQuery中使用getJSON函数时,回调函数不起作用
我试图在jQuery中使用getJSON函数来导入一些数据并触发回调函数。 回调函数不运行。 但是,如果我使用get函数尝试相同的操作,它可以正常工作。 奇怪的是,即使我将“json”作为类型传递,它也可以与get函数一起使用。 为什么会这样? 我在Firefox 3和IE 7中测试了以下文件:
ajax test $("#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" ) });
无论我访问哪个URL,这似乎都会发生,只要它在同一个域上。 我尝试传递一些数据,这没有什么区别。
当然,我可以通过使用get函数解决问题,就像我在第3次测试函数中所做的那样,但我仍然很好奇为什么会发生这种情况。
我知道这里有一个类似的问题 ,但它没有回答我的问题。
json需要有效,否则回调不会触发。
$ .getJSON()是JSONP,所以改变它:
$("#test2").click(function() { $.getJSON("index.html?callback=?", function(response) { alert('hi'); } ) });
服务器接收的param回调充满了类似:jsonp1291077863309。 在响应中写回回函数jsonp1291077863309(PUT_JSON_HERE)。
对! 经过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=?
的urlcallback=?
参数! (仅当您调用的URL不在服务于执行jquery脚本的同一服务器中时才需要)…
JQuery会自动替换’?’ 在将其发送到服务器之前具有方便的值。 您不必担心使用哪个值,它将对您无缝(如果服务器正确的工作!这就是我的问题!):-)
希望能帮助到你!
在表面下,当你调用getJSON
,这就是发生的事情:
// ~ line 3216 getJSON: function( url, data, callback ) { return jQuery.get(url, data, callback, "json"); }, // ... rest of jQuery core
所以必须有一些其他东西阻止回调被触发……
我会从每个回调的不同事物(不仅仅是’hi’)开始alert
**,这样你知道哪一个失败/成功。
正如许多其他人所提到的,您需要有效的JSON(即符合http://json.org/上的规则)才能使getJSON
正常工作(这意味着您无法通过示例中的getJSON
获取HTML)。
最后一次测试的原因是因为最后一个参数“json”没有被解释为“类型”。 因为以下不起作用:
$("#test3").click(function() { $.get("index.html", '', function(response) { alert('hi'); //works }, "json" ) });
我有同样的问题,尽管有良好的JSON等。我能够查询我的webservice,并获得响应,但是,我的回调函数没有触发。 在搜索网后,我大多数互联网建议使用’jsonp’,我自从我的应用程序执行一些跨域调用后做了,还添加了’回调?’ 到我的url。 这不起作用,但包括返回JSON的回调解决了我的问题。 下面的代码解释了我的意思:
//server side json formed somewhere up here String data = callback + "("+ json +")" ;
由此引起的反应类似于“ jsonp1280403476086([{"Name":"Jack Sparrow
“,jQuery似乎没有问题,所以从来没有死在我身上。
希望这可以帮助。
如果您使用$.getJSON
或$.get
,请在MVC2中使用$.post
而不是$.getJSON()
,确保将JsonRequestBehavior
设置为AllowGet
。 否则,这将返回HTML错误,导致您的请求不会触发回调。
确保控制器中的JsonResult方法上面没有列出[HttpPost]。 这不会将数据返回到.getJSON调用。