升级到jQuery 1.5后没有调用getJSON回调

时间:2011-02-03 14:37:08

标签: jquery

美好的一天!

我在jQuery 1.4.4上使用getJSON()运行插件,在没有调用升级到1.5回调之后。返回的JSON有效(我已使用验证器检查过)。

在挖掘更多之前我想好像这是一个常见的问题?另外我注意到jQuery添加到URL的其他get参数?callback=...

提前致谢!

编辑:我似乎想出了如何创建测试用例,看起来JQuery验证1.7(最新版本)是原因:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="ru">

<head>
    <title>

    </title>

    <meta http-equiv="content-type" content="text/html; charset=utf8" />     
    <script type="text/javascript" src="js/jquery-1.5.min.js"></script>
<!--    
    If I uncomment this - it will not work
    <script type="text/javascript" src="js/jquery.validate.js"></script>
-->
</head>
<body>
<script type="text/javascript">
$(function(){
    $.ajaxSetup({ cache: false });
    $('#clickme').click(function(){
        var params = {userid : 'some-user-id-to-choose-right-temp-FTP-folder-for-the-user'};
        $.getJSON('/ajax-page_material-edit-ftp-filelist.php', params, function(data) {
            console.log(data);
        });
    });
});
</script>

<a href="#" id="clickme">Click Me!</a>

</body>
</html>

也许这个插件中的代码是原因:

// ajax mode: abort
// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() 
;(function($) {
    var ajax = $.ajax;
    var pendingRequests = {};
    $.ajax = function(settings) {
        // create settings for compatibility with ajaxSetup
        settings = $.extend(settings, $.extend({}, $.ajaxSettings, settings));
        var port = settings.port;
        if (settings.mode == "abort") {
            if ( pendingRequests[port] ) {
                pendingRequests[port].abort();
            }
            return (pendingRequests[port] = ajax.apply(this, arguments));
        }
        return ajax.apply(this, arguments);
    };
})(jQuery);

4 个答案:

答案 0 :(得分:2)

您可能知道,jQuerys ajax模块几乎完全被重写。它现在使用一个promise maker对象,当新的jXHR对象到达状态resolved时将触发该对象。

如果您自己致电.getJSON(),可以尝试调用它:

$.getJSON('/path/file').then(function() {
    // success
}, function() {
    // fail
});

如果您使用的插件正在调用.getJSON(),那么这是一个问题,除非您可以/想要自己修复可能的问题。无论如何,即使这个系统是新的,它“应该”向后兼容。

答案 1 :(得分:0)

在jQuery 1.5中,

.ajax已经发生了重大变化。现在有一个名为jqXHR的新对象返回而不是XHRHttpRequest,但它应该向后兼容。不幸的是,.getJSON的文档已经过时,仍然会显示1.4.4的文档。我建议您查看.ajax的更新文档,看看是否可以搞清楚。

?callback=已添加到uri以支持jsonp和/或跨域请求,因此如果您正在执行此操作,则会自动添加。

答案 2 :(得分:0)

答案 3 :(得分:0)

您也可以暂时使用此黑客,请在此处记录:http://bugs.jquery.com/ticket/8084

//  HACK:
//    jquery-1.5 sets up jsonp for all json ajax requests
//    undo the jsonp setting here so the json requests work again
$.ajaxSetup({
    jsonp: null,
    jsonpCallback: null
});