jQuery JSONP AJAX请求有时会因“TypeError:无法调用未完成的方法'而失败”

时间:2014-01-23 01:14:15

标签: javascript jquery ajax jsonp

我正在尝试在书签中使用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);
});

如果您转到以下亚马逊页面:

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

在你的控制台中执行上面的代码,你会发现它有效。但是,如果你去这个亚马逊页面:

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

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

TypeError: Cannot call method 'done' of undefined

导致此问题的原因是什么?如何修复?

编辑:我注意到的一件有趣的事情是,在AJAX请求工作的页面上,回调参数似乎总是如下所示:

callback=jQuery1640586556919850409_1390439428297

在失败的页面上,它似乎总是如下:

callback=jsonp1390439502398

我在一堆不同的亚马逊网页上试过这个,看起来这种行为是一致的。

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

2 个答案:

答案 0 :(得分:2)

不同版本的jQuery

信不信由你,这两个页面正在使用不同版本的jQuery。

您可以通过在控制台中输入以下内容来自行确定:$()。jquery

the first page正在运行v1.6.2

the second page正在运行v1.2.6

查看jQuery.ajax()here)的jQuery文档,看起来直到v1.5才将其添加到jQuery

希望有所帮助。

答案 1 :(得分:1)

如果你运行console.log(jQuery.ajax);在控制台中,您将看到您引用的第二个链接在jQuery.ajax类中不包含done函数(因为它们是两个不同的版本)。您可以执行版本检查并根据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);
        }
    });  
}