Jquery ajaxrequest xhr.status code 0 но html code status 200 - PullRequest
4 голосов
/ 12 января 2012

Это не проблема межсайтовых запросов, так как большинство гугл-ответов на мои вопросы состоит из.

Я получаю xhr.status 0 och xhr.statusText "error" при попытке сделать ajax-запрос с помощью функций jquery .get и .load.Хотя в Firebug запрашиваемая страница загружается с html-кодом состояния 200, я могу прочитать текст в ответе, и заголовок ответа выглядит нормально.

Мой код:

  function GetProjectTask(e) {
    var loader = $('#' + e + 'tasks div.loader');
    var content = $('#' + e + 'tasks div.content');
    var img = $('#' + e + 'tasks img.collapseimg');
    if (loader.html() == null || loader.html().trim() == '') {
        if (content.html() == null || content.html() == '') {
            img.attr('src', 'images/expanded.gif');
            loader.html('<img src="images/loading.gif" alt="Wait..."> Loading support tasks');
            content.load('includes/my' + e + 'tasks.php',
                function (response, status, xhr) {
                    if (status == "error") {
                        var msg = "Sorry but there was an error: ";
                        alert(msg + xhr.status + " - " + xhr.statusText);
                    }
                }
            );
            return;
        }
    }
    content.empty();
    loader.empty();
    img.attr('src', 'images/collapsed.gif');
  } 

Сервер: IIS v.7.5 Jquery: v1.6.2

Есть идеи?

Ответы [ 2 ]

9 голосов
/ 27 января 2012

Я полагаю, что нулевой код состояния может многое значить.В моем случае я получал нулевой код состояния из-за того, что пользователь покинул страницу до завершения цикла запрос-ответ.Вы также можете получить код состояния ноль, если связь с сервером не удалась.Я в основном суммировал это как сбой в исходящей связи от отправителя.Вот почему он также предлагает межсайтовые запросы и другие причины, относящиеся к клиентской части.

В разделе 4.8.1 спецификации W3 XMLHttpRequest говорится:

Атрибут статуса должен возвращать результат выполнения этих шагов:
Если состояние НЕ ОТПРАВЛЕНО или ОТКРЫТО, возвращает 0 и завершает эти шаги.
Если установлен флаг ошибки, возвращает 0 и завершает эти шаги.
Возвращает код состояния HTTP.

Если я правильно прочитал спецификацию, UNSENT и OPENED - это состояния, в которых может находиться запрос до его отправки.И флаг ошибки устанавливается, если:

Флаг ошибки указывает на какой-либо тип сетевой ошибки или прерывания запроса ...

Проблема с этим кодом состоянияесли пользователь отменяет запрос на отклонение, я не считаю это условием ошибки, поскольку это преднамеренное действие со стороны пользователя.Проблемы с сетью я считаю ошибкой.Например, если пользователь вызывает действие, которое приводит к запросу ajax, который имеет обработчик ошибок, чтобы перенаправить их на страницу ошибки.Если пользователь покидает текущую страницу, тем самым прерывая запрос с точки зрения удобства использования, не имеет смысла перенаправлять его на страницу ошибки.Реализация спецификации хороша, за исключением того, что мне еще предстоит определить метод, позволяющий узнать, что нулевой код состояния поступил из прерванного запроса или по какой-то другой причине.Если бы мне удалось определить разницу, я смог бы предпринять соответствующие действия.

РЕДАКТИРОВАТЬ: 03/18/2014

В ответ на комментарий @ariera9 августа 2013 года я предоставляю приблизительное описание того, каким был обходной путь.Однако проблема в том, что прошло какое-то время с тех пор, как я решил эту проблему, и моя память расплывчата.

Если я правильно помню, идея заключается в том, чтобы определить, был ли код состояния 0 вызван тем, что пользователь косвенно прерывалзапрос заключался в том, чтобы поместить код обработки ошибок в свой собственный обратный вызов отдельно от обратного вызова ошибок.Затем в ответном сообщении об ошибке вы проверяете, равен ли код состояния нулю.Если это так, вызовите ваш обратный вызов ошибки с задержкой по времени, в противном случае вызовите обратный вызов ошибки.Идея заключается в том, что если код ошибки равен нулю, тогда задержка в обработке этой ошибки позволяет браузеру фактически выполнять навигацию.Разрешение браузеру выполнять навигацию должно очистить любой выполняющийся JavaScript, и, таким образом, обработчик ошибок не сработает.

Теперь это клудж, и он может даже не работать так же, как я, я действительно не помню сложностейпроблемы, но, надеюсь, это приведет кого-то еще по правильному пути.

3 голосов
/ 12 января 2012

Код статуса ответа 0 был вызван (в моем случае, когда я разрабатывал веб-сайт) выполнением запросов xhr со страницы, обслуживаемой моим локальным сервером, на тот же сервер на localhost.

Другая причина (с возможнымрешения) можно найти здесь:

"Убедитесь, что вы используете относительные URL-адреса для своих запросов AJAX."- неверный код ответа HTTP '0'

...