jQuery JSONP AJAX 请求有时会失败并显示"TypeError: Cannot call method 'done' of undefined"



我正在尝试在书签中使用jquery jsonp ajax请求,我发现该请求在某些页面上有效,但在其他页面上不起作用。这是示例代码:

jQuery.ajax({
    url: "http://echo.jsontest.com/key/value/one/two",
    type: "GET",
    dataType: "jsonp",
    cache: false
}).done( function(data){
    console.log(data);
}).fail(function(jqXHR, textStatus, errorThrown){
    console.log("errorThrown: " + errorThrown);
});

如果您转到以下Amazon页面:

http://www.amazon.com/dp/b00336eutk?psc=1

并在控制台中执行上述代码,您会发现它有效。但是,如果您转到此Amazon页面:

http://www.amazon.com/dp/b00e5uhsyw?psc=1

并在控制台中执行上述代码,出现以下错误:

TypeError: Cannot call method 'done' of undefined

是什么引起了这个问题,如何解决?

编辑:我注意到的一件有趣的事情是,在Ajax请求有效的页面上,回调参数似乎总是看起来像这样:

callback=jQuery1640586556919850409_1390439428297

在失败的页面上,它似乎总是看起来像这样:

callback=jsonp1390439502398

我已经在一堆不同的亚马逊页面上尝试了此操作,似乎这种行为是一致的。

也许这只是一个巧合,但我认为这可能值得指出。

不同版本的jquery

相信与否,这两个页面正在使用不同版本的jQuery。

您可以通过将其输入控制台来确定:$()。jQuery

首页正在运行v1.6.2

第二页正在运行v1.2.6

查看jQuery.ajax()的jQuery文档(在此),看起来它没有添加到jQuery,直到v1.5

希望会有所帮助。

如果运行台(jquery.ajax);在控制台中,您会看到您引用的第二个链接在jquery.ajax类中不包含完成功能(因为它们是两个不同的版本)。您可以根据jQuery是否具有该类方法来进行版本检查并处理两个不同的解决方案。这适用于您发布的两个链接:

//get the jQuery version
var version = jQuery.fn.jquery,
    parts = version.split('.');
//piece together a version integer
version = parseInt(parts[0]+parts[1]+parts[2],10);
if (version >= 150) {
    //new method
    jQuery.ajax({
        url: "http://echo.jsontest.com/keyu/value/one/two",
        type: "GET",
        dataType: "jsonp",
        cache: false
    }).done( function(data){
        console.log(data);
    }).fail(function(jqXHR, textStatus, errorThrown){
        console.log("errorThrown: " + errorThrown);
    });
} else {
    jQuery.ajax({
        url: "http://echo.jsontest.com/keyu/value/one/two",
        type: "GET",  
        dataType: "jsonp",
        success: function(data){  
          console.log(data); 
        },  
        error: function(e){  
          console.log(e);
        }
    });  
}

最新更新