Javascript JS:innerHTML导致内容意外更改
在过去的几周里,当我遇到这个奇怪的bug时,我一直在从事一个复杂的项目。我在下面的代码中隔离了我的问题,这是复制它的最小可能的有效HTML和JS:Javascript JS:innerHTML导致内容意外更改,javascript,html,innerhtml,Javascript,Html,Innerhtml,在过去的几周里,当我遇到这个奇怪的bug时,我一直在从事一个复杂的项目。我在下面的代码中隔离了我的问题,这是复制它的最小可能的有效HTML和JS: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Chat</title> <scri
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Chat</title>
<script type="text/javascript">
//<![CDATA[
function refresh()
{
var old = document.getElementById("conversation").innerHTML;
var message = '<img/>';
if(old != message) {
alert("Old:\n" + old);
alert("New:\n" + message);
//alert("Refreshed!");
document.getElementById("conversation").innerHTML = message;
}
}
//]]>
</script>
</head>
<body onload="refresh()">
<div id="conversation"></div>
<script type="text/javascript">var myVar = setInterval(function(){refresh();},1000);</script>
</body>
</html>
聊天
//
var myVar=setInterval(函数(){refresh();},1000);
函数refresh()
每秒检查div
中的代码是否与存储的字符串不同。如果它不同,则用字符串替换div
的内容。但是,每次检查时,它都会看到内容和存储的字符串不同。尽管字符串是
,但内部HTML
返回为
。我发现,对于任何自动关闭标记,它都会自动删除斜杠。对于不应该自动关闭的标记(如
),它会自动将其拆分为两个标记(如
)。对于任何其他标记或文本,它不起任何作用
我真的不明白为什么
div
的内容在变化。如果有人能解释原因,我将不胜感激。如果有人能提供一个可能的解决方案,我将不胜感激。这是因为浏览器使用的是HTML解析器,而不是页面的XML解析器,这就是它将删除结束斜杠的原因 我自己也是一个新手,但我认为Matt Ball所指的是这样一个事实,即当您应该创建一个新的DOM元素时,您正在创建一个字符串,因此对函数的一个简单更改是:
var convo = document.getElementById("conversation");
function refresh() {
var old = convo.innerHTML;
var message = document.createElement("IMG");
if (old != message) {
alert("Old:\n" + old);
alert("New:\n" + message);
//alert("Refreshed!");
convo.innerHTML = message;
}
}
这是一个
注意:我添加了全局corva
变量以减少击键次数,并使用document.createElemet
而不是innerHTML
将新的图像元素添加到DOM中。然后,您可以在函数内部或外部使用firstChild
方法调用该图像元素,如下所示:
convo.firstChild;
div的内容正在更改,因为字符串
不等于字符串
。首先,为什么要对HTML执行基于字符串的相等性检查而不是正确的DOM操作?谢谢大家的帮助。整个程序从服务器获取可以包含HTML标记的字符串,并将它们放入div
。它仅在检测到当前字符串和上一个字符串之间存在差异时更新。当我只尝试比较字符串时,我希望避免使用像DOM操作这样复杂的操作。您关于这不可能的信息让我找到了一个不同的解决方案:将old
存储为静态变量,以消除读取文档本身的需要。再次感谢您。请记住,conva.innerHTML=message将显示由浏览器解析document.createElement(“IMG”)
产生的字符串,而不是读取
的文本字符串。也许更好的方法是使用conva.appendChild(message)
,但是您必须重新构造代码,这样您的setInterval
函数不会导致它每秒追加一个新的子级。