设置 innerHTML:为什么它不会更新 DOM
Setting innerHTML: Why won't it update the DOM?
想知道为什么当我重新分配变量时我无法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的内部 HTML 保持不变。这是为什么呢?
**经过几年更多的经验...**
对于那些刚开始(像我一样(发现自己问同样事情的人来说,有两个重要的概念需要理解:
- 通过引用分配:我的错误是我认为
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
计算结果为字符串。我不确定你为什么会期待任何不同的东西。考虑一下:
var a = 'foo'; // now a = 'foo'
var b = a; // now a = 'foo', b = 'foo'
b = 'bar'; // now a = 'foo', b = 'bar'
重新分配b
不会更改a
。
编辑添加:如果上面不清楚,如果你想改变innerHTML
,你可以直接分配给它:
document.getElementById("my_div").innerHTML = "Hello";
您不需要也不能使用中间变量。
var myDivValue = document.getElementById("my_div").innerHTML;
存储 innerHTML 的值,innerHTML 包含一个字符串值,而不是一个对象。因此,不可能引用elem。必须直接存储对象才能修改其属性。
var myDiVElem = document.getElementById("my_div");
myDiVElem.innerHTML = 'Hello'; // this makes the change
对于未来的谷歌用户来说,我的问题是我调用了复数元素。
document.getElementsByClassName(‘class’).innerHTML
所以它返回了一个数组而不是单个元素。我把它改成单数。
document.getElementByClassName(‘class’).innerHTML
这样我就可以更新内部HTML值了。
你应该像这样设置 innerHTML 值
var myDivValue = document.getElementById("my_div").innerHTML = "Hello";
在设置 innerHTML/outerHTML 后重新分配元素:
let indexInParent=[].slice.call(elem.parentElement.children).indexOf(elem);
elem.innerHTML=innerHTML;
elem=elem.parentElement.children[indexInParent];
我有同样的问题(设置 innerHTML:为什么它不会更新 DOM?(,但就我而言,这是一个不同的问题。我的问题是使用"InnerHtml"而不是"InnerHTML"。令人沮丧的是,js会让你继续运行它,没有任何警告。例如,使用下面的代码,单击后没有错误,控制台日志将显示innerHtml已成功修改。但是在html页面上,你看到它仍然说"再见"。
<div id="my_div" onclick="clicky();">
Bye.
</div>
<script type="text/javascript" charset="utf-8">
function clicky() {
document.getElementById("my_div").innerHtml="<div>Hello</div>";
console.log(document.getElementById("my_div").innerHtml);
}
</script>
对于仍在挣扎的人,请确保您拼写的是财产权。因为它是innerHTML而不是innerHtml。太容易弄错了!
刚刚浪费了几个小时,我还可以补充一点,不要意外地有两个具有相同ID的元素,这一点至关重要
- 从angularjs中的javascript更新dom
- Javascript没有't更新DOM,直到用户交互
- 如何让React JS点击处理程序在执行时更新DOM
- Ionic:AngularJS变量未使用$scope更新DOM
- 使用Javascript通过ajax回调更新DOM
- Angular JS根据搜索结果和点击事件更新DOM元素
- 我如何告诉javascript立即更新DOM
- 引导复选框-x 选中时未正确更新 DOM - 如何验证表单
- 通过Javascript重复更新DOM后,网页变得很慢
- jQuery更新DOM并运行change()方法
- 使用Angular Directive用$scope属性更新DOM-只要指令运行(无需等待事件)
- AngularJS:在长时间循环期间强制更新DOM(即进度指示器)
- Polymer:当数组中的对象被外部代码修改时,更新dom重复元素
- Javascript 复杂的附加和更新 DOM,因此可以使用 remove(); 将其删除
- ng-show 不更新 DOM 元素
- 浏览器如何从内部HTML属性更新DOM
- 更新 DOM 中的标签
- 是否有模板引擎可以在数据更改时更新 DOM
- 在 AngularJS 中使用从 websockets 动态获取的外部 JSON 数据自动更新 DOM
- 更新 DOM 后“鼠标向上”出现问题