Firefox & AJAX Junk после элемента документа - PullRequest
14 голосов
/ 22 мая 2011

Я использую скрипт выборки страниц для динамической загрузки веб-страницы в div. Вот код. Кстати, я использую Firefox с Kubuntu

function fetch(URL, divId) {
        req = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP.3.0");
    req.open("GET", URL);
    req.onreadystatechange = function() {
        if (req.readyState == 4 && req.status == 200) {
            document.getElementById(divId).innerHTML = req.responseText;
        }
    }
    req.send(null);
}

Когда я пытаюсь загрузить страницу, ничего не происходит, и я получаю сообщение об ошибке

Ошибка: нежелательная после элемента документа
Исходный файл: file: ///home/amnite/Stuff/MetalBraska/Shows/ContentRight.html
Строка: 2, столбец: 1
Исходный код:
<img src="Layout/HeaderDiv.jpg" width="250px" height="7px">

1 Ответ

36 голосов
/ 22 мая 2011

Мой ответ в разделах

  • Ошибка
  • Но это даже не имеет значения
  • Реальная проблема
  • Как кто-то мог иметьобнаружил причину / реальную проблему
  • Решение, которое включает обработку ошибок

Ошибка

Ошибка состоит в том, что он пытается проанализировать ContentRight.html как XMLфайл.XML-файлы строги, поэтому любая мелочь, например, отсутствие </img>, может привести к полному отказу.В этом случае существует более одного элемента верхнего уровня.(в обычном HTML есть только один элемент верхнего уровня <html>).Второй элемент верхнего уровня считается «Хлам после элемента документа».Я предполагаю, что изображение является вторым элементом, который вызывает проблему.

Но это даже не имеет значения

Но это все не имеет значения.У вас нет причин анализировать XML на первой странице.Вы просто хотите HTML.Правильно?Я предполагаю, что он пытается проанализировать XML и сохранить его в responseXML.Из-за ошибки responseXML является нулевым.Но вы используете responseText, поэтому проблем быть не должно.(игнорируйте ошибку)

Реальная проблема

Все это и теперь я вижу проблему.Вам требуется HTTP-статус 200 с req.status == 200.Поскольку вы не используете http://, а вместо этого file://, нет кода состояния и возможности серверной ошибки 500 и малой вероятности обнаружения не найденного 404.Так что все, что вы получите, это 0.Хорошей практикой, когда вы получаете что-то вроде этого, является добавление линий оповещения

Как кто-то мог найти причину / реальную проблему

req.onreadystatechange = function() {
    alert(req.readyState)
    if (req.readyState == 4 && req.status == 200) {
        document.getElementById(divId).innerHTML = req.responseText;
    }
}

будет предупреждать 1 2 34 так что вы знаете, readyState равно 4. Затем попробуйте

req.onreadystatechange = function() {
    if(req.readyState == 4)
        alert(req.status)
    if (req.readyState == 4 && req.status == 200) {
        document.getElementById(divId).innerHTML = req.responseText;
    }
}

Вы получите 0, и вы окажетесь ближе к проблеме.

Решение, которое включает обработку ошибок

Хорошее решение -

req.onreadystatechange = function() {
    if (req.readyState == 4 && (req.status == 200 || req.status == 0 && req.responseText)) {
        document.getElementById(divId).innerHTML = req.responseText;
    } else {
        document.getElementById(divId).innerHTML = '<b>Error. HTTP ' + req.status + '</b>'
    }
}

Поскольку, если статус равен 0, то может означать сбой подключения к Интернету, в этом случае responseText будет пустым, и тогда вы будетеполучить Error. HTTP 0.Если бы он не был пустым, это означало бы, что это было file://, и это работало бы как очарование.

И, конечно, ошибка на уровне сервера выдала бы Error. HTTP 500 или еще много чего.

...