仅在Internet Explorer中中止ajax调用时出现jQuery错误

时间:2010-06-01 11:05:31

标签: jquery xmlhttprequest

当鼠标悬停在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)行发生特定错误。有什么想法吗?

3 个答案:

答案 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);

“取消”待处理的请求。