我正在使用页面获取脚本将网页动态加载到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);
}
当我试图让它加载页面时没有任何反应,我收到错误
错误:文档元素
之后的垃圾 源文件:file:///home/amnite/Stuff/MetalBraska/Shows/ContentRight.html
行:2,列:1
源代码:
<img src="Layout/HeaderDiv.jpg" width="250px" height="7px">
答案 0 :(得分:36)
我的答案在
部分错误是因为它试图将ContentRight.html
解析为XML文件。 XML文件是严格的,所以像缺少</img>
这样的小东西都会导致整个失败。在这种情况下,有多个顶级元素。 (在普通HTML中,只有一个顶级元素<html>
)。第二个顶级元素被认为是“文档元素之后的垃圾”。我假设图像是导致问题的第二个元素。
但这就是重点。您没有理由在第一页中解析XML。你只想要HTML。对?我的猜测是,它正在尝试解析XML并将其存储到responseXML
。由于该错误,responseXML
为空。但是你正在使用responseText
所以应该没有问题。 (忽略错误)
所有这些,现在我看到了问题。您需要使用req.status == 200
的HTTP状态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
或其他什么。