jQuery AJAX запрашивает сбой в IE8 с сообщением ' Error: этот метод не может быть вызван, пока не будет вызван метод open.'


Я использую jQuery 1.4.2 и пытаюсь выполнить простой AJAX-запрос. Целевой URL-адрес возвращает строку JSON (я проверил ее с помощью jslint). Запрос работает в Firefox и Chrome, но не хочет работать в IE8, и я не могу определить, почему. Вот призыв:

jQuery.ajax({
url: 'http://' + domain + '/' + 'helper/echo/',
dataType: 'json',
success: function(data) {
 alert(data);
},
beforeSend: function(request, settings) {
 alert('Beginning ' + settings.dataType + ' request: ' + settings.url);
},
complete: function(request, status) {
 alert('Request complete: ' + status);
},
error: function(request, status, error) {
 alert(error);
}
});

, т. е. будет выполнять beforeSend обратного вызова и обратный вызов ошибки. Ошибка обратного вызова предупреждает с сообщением:

Error: This method cannot be called until the open method has been called.

Мой заголовок ответа возвращает значение Content-Type: text/javascript; charset=UTF-8.

Что происходит с IE? Я запуск сервера на localhost, выполнение запроса от http://localhost:8080/psx к http://localhost:8080/helper . Может быть, IE блокирует этот запрос? Я пытался установить Fiddler для анализа трафика запросов, но он не будет работать на моей машине, потому что он довольно заблокирован. Огненный Жук мне позволяет, но там вроде все хорошо.

Спасибо за помощь!!!

1 6

1 ответ:

Хорошо, вот и решение! Запрос использовал window.XMLHttpRequest(), который по какой-то причине не работает должным образом в IE8. jQuery не возвращается к window.ActiveXObject("Microsoft.XMLHTTP"), как это должно быть.

Добавьте это в свой скрипт где-то перед вызовом AJAX (только проверено в IE8, не в других IE):

jQuery.ajaxSetup({
            xhr: function() {
                    //return new window.XMLHttpRequest();
                    try{
                        if(window.ActiveXObject)
                            return new window.ActiveXObject("Microsoft.XMLHTTP");
                    } catch(e) { }

                    return new window.XMLHttpRequest();
                }
        });

Вот как я пришел к решению:

  1. Обновлено до jQuery 1.4.4 в случае, если проблема была исправлена.
  2. шагнул через Firebug debugger и DevTools debugger, пока результаты оказались совершенно иными.
  3. в строке 5899 функция ajax() создает объект XmlHttpRequest с помощью функции xhr (). В Firefox он возвращал хорошие данные. В IE это возвращалось со всеми полями, являющимися Error: This method cannot be called until the open method has been called.
  4. я проанализировал эту функцию в строке 5749, return new window.XMLHttpRequest();
  5. Я погуглил и наткнулся на эту страницу , которая имеет ту же проблему, и предложил решение, которое работает для меня.
  6. официальный билет jQuery :