当鼠标悬停在jcarousel中的图像上时,我的网站会显示一个弹出窗口,其内容通过ajax加载。我正在做我认为相当简单的事情;保留xhrRequest对象的句柄,并在发出新请求之前中止现有对象。
它在IE以外的所有浏览器中运行良好,我收到错误“对象不支持此属性或方法”
以下是触发它的代码:
function showPopup {
// ... code snipped ...
// cancel the existing xhr request
if (showPopup.xhrRequest != null) {
showPopup.xhrRequest.abort();
showPopup.xhrRequest = null;
}
showPopup.xhrRequest = $.ajax({url: url,
type: "GET",
success:function(data) {
$("#popup-content").html(data);
}
});
// ... code snipped ...
}
showPopup.xhrRequest = null;
在Firefox和Chrome中运行良好。我将错误追溯到ajax函数内的jquery.js中的这段代码(我的jQuery副本中的第5233行):
// Override the abort handler, if we can (IE doesn't allow it, but that's OK)
// Opera doesn't fire onreadystatechange at all on abort
try {
var oldAbort = xhr.abort;
xhr.abort = function() {
if (xhr ) {
oldAbort.call( xhr );
}
onreadystatechange( "abort" );
} catch(e) { }
oldAbort.call(xhr)行发生特定错误。有什么想法吗?
答案 0 :(得分:5)
在jquery论坛上找到了答案。见这里的讨论: http://forum.jquery.com/topic/object-doesn-t-support-this-property-or-method-from-jquery-1-4-1-in-ie7-only
IE7及以下的解决方法:
$.ajax({
...
xhr: function() {
if ($.browser.msie && $.browser.version.substr(0,1) <= 7)
return new ActiveXObject("Microsoft.XMLHTTP");
else
return new XMLHttpRequest();
},
...
});
答案 1 :(得分:2)
问题是jQuery for Internet Explorer提供的XMLHttpRequest对象默认为COM实现,而不是本机window.XMLHttpRequest
对象,并且无法覆盖其方法。
此外,在同一场景中,abort
方法不是Javascript函数,因此它没有原型和call
方法。在ActiveX实现中根本不提供abort
,因为它是在IE7中使用本机XMLHttpRequest对象引入的。
原生XMLHttpRequest是在IE7中引入的,所以你想要做的事情在IE6中永远不会起作用,如果在IE7 / IE8中的某些用户在他们的设置中禁用了本机XMLHttpRequest
,它将无效(之前我遇到过这个问题)。
您可以使用$.ajax()
或xhr
的{{1}}选项更改jQuery中的默认值:
<强> XHR 强>
用于创建XMLHttpRequest对象的回调。 默认为ActiveXObject(如果可用)(IE),否则为XMLHttpRequest。重写以提供您自己的XMLHttpRequest实现或工厂增强功能。
(强调我的)
答案 2 :(得分:2)
我在IE7中遇到了这个问题,并在我的应用程序中进行了以下解决方法。
当进行ajax-request存储jqXHR某处,然后当回调被调用时,仅当jqHXR参数与你存储的on匹配时才动作。
doit = function(){
$("#target").data("req",$.getJSON(an_url,
{},
function(msg,status,xhr){
if(xhr===$("#target").data("req")){
$("<li/>").text(msg).appendTo("#target");
doit(luku);
} else {
$("<li/>").text("aborted!").appendTo("#target");
}
}));
}
其他地方你可以打电话给。
$("#target").data("req",false);
“取消”待处理的请求。