我正在尝试在书签中使用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
我在一堆不同的亚马逊网页上试过这个,看起来这种行为是一致的。
也许这只是一个巧合,但我认为值得指出。
答案 0 :(得分:2)
信不信由你,这两个页面正在使用不同版本的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);
}
});
}