【发布时间】:2012-01-02 00:47:12
【问题描述】:
想知道为什么我在重新分配变量时无法让document.getElementById("my_div").innerHTML 更新 DOM。例如:
<div id="my_div" onclick="clicky();">
Bye.
</div>
<script type="text/javascript" charset="utf-8">
function clicky() {
var myDivValue = document.getElementById("my_div").innerHTML;
myDivValue = "Hello";
console.log(myDivValue);
}
</script>
在日志中,我可以看到当我单击时变量被重新分配,但 my_div 的 innerHTML 保持不变。这是为什么呢?
经过几年的积累...
对于那些刚开始(和我一样)并发现自己问同样问题的人来说,有两个重要的概念需要理解:
-
通过引用分配: 我的错误是我认为
var myDivValue = element.innerHTML会创建一个对 innerHTML 的引用/地址,并且每次我为该引用分配一个新值时,我都可以更新内容,但事实并非如此它有效。 -
按值分配: 相反,我只是复制
element.innerHTML值(为空白)并将值分配给myDivValue,然后在myDivValue = "Hello";中分配一个新值到myDivValue,所以它当然永远不会更新element.innerHTML。
令人困惑的部分:当在 JS 中使用赋值运算符 (=) 时,并不清楚您是在分配引用还是值(var referenceName = reference_to_thing 与 var containerName = newValue),
正如许多人在答案中所说,正确的做法是将document.getElementById("my_div") 元素分配给myDiv:
var myDiv = document.getElementById("my_div")
现在我有了一个名为myDiv 的元素的引用,我可以随时更新innerHTML 属性:
myDiv.innerHTML = "Hello" // innerHTML is now "Hello"
myDiv.innerHTML = "Goodbye" // Changed it to "Goodbye"
【问题讨论】:
-
innerHTML返回一个字符串,而不是对 DOM 的引用。 -
顺便说一句,您不必手动查询该元素 - 只需通过使用
this参数调用它来将其引用传递给处理程序。 -
抱歉,我不明白
this在这种情况下是如何工作的。我试过console.log(document.this),但它只返回一个Undefined. -
<div id="my_div" onclick="clicky(this);">然后function clicky ( elem ) { elem.innerHTML = ...
标签: javascript innerhtml