Firefox & AJAX Junk после элемента документа

Im использует страницу fetch script для динамической загрузки веб-страницы в div. Вот код. BTW Im, использующий Firefox w/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);
}

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

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

Ответы

Ответ 1

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

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

Ошибка

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

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

Но все это не относится к делу. Нет причин для того, чтобы вы разбирали XML на первой странице. Вы просто хотите HTML. Правильно? Я предполагаю, что он пытается проанализировать XML и сохранить его в responseXML. Из-за ошибки responseXML имеет значение null. Но вы используете 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 3 4, чтобы вы знали, что 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 или еще что-то.