Ошибка jQuery при прерывании вызова ajax только в Internet Explorer - PullRequest
4 голосов
/ 01 июня 2010

При наведении курсора на изображение в 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. Я проследил ошибку до этого фрагмента кода в jquery.js внутри функции ajax (строка 5233 в моей копии jQuery):

// 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 ]

5 голосов
/ 01 июня 2010

Нашел ответ на этот вопрос на форумах 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();
    },
    ...
});
2 голосов
/ 26 июля 2012

Я получил эту проблему в IE7 и сделал следующий обходной путь в моем приложении.

При создании ajax-запроса сохраните jqXHR где-нибудь, а затем, когда обратный вызов будет вызван, действуют, только если jqHXR-параметр соответствует сохраненному вами.

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

чтобы "отменить" ожидающий запрос.

2 голосов
/ 01 июня 2010

Проблема заключается в том, что объект XMLHttpRequest, предоставляемый jQuery для Internet Explorer, по умолчанию является реализацией COM, а не собственным объектом window.XMLHttpRequest, и его методы не могут быть переопределены.

Кроме того, в том же сценарии метод abort не является функцией Javascript, поэтому у него не будет прототипа и метода call. abort вообще недоступен в реализациях ActiveX, так как он был представлен с собственным объектом XMLHttpRequest в IE7.

Собственный XMLHttpRequest был введен в IE7, поэтому то, что вы пытаетесь сделать, никогда не будет работать в IE6, и оно не будет работать для некоторых пользователей в IE7 / IE8, если в их настройках отключено встроенное XMLHttpRequest (и Я сталкивался с этой проблемой раньше).

Вы можете изменить значение по умолчанию в jQuery, используя опцию xhr $.ajax() или $.ajaxSetup():

XHR
Обратный вызов для создания объекта XMLHttpRequest. По умолчанию ActiveXObject доступен (IE) , в противном случае XMLHttpRequest. Переопределите, чтобы предоставить собственную реализацию XMLHttpRequest или улучшения фабрики.

(акцент мой)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...