【问题标题】:Setting innerHTML: Why won't it update the DOM?设置innerHTML:为什么它不会更新DOM?
【发布时间】: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 保持不变。这是为什么呢?


经过几年的积累...

对于那些刚开始(和我一样)并发现自己问同样问题的人来说,有两个重要的概念需要理解:

  1. 通过引用分配: 我的错误是我认为 var myDivValue = element.innerHTML 会创建一个对 innerHTML 的引用/地址,并且每次我为该引用分配一个新值时,我都可以更新内容,但事实并非如此它有效。
  2. 按值分配: 相反,我只是复制element.innerHTML 值(为空白)并将值分配给myDivValue,然后在myDivValue = "Hello"; 中分配一个新值到myDivValue,所以它当然永远不会更新element.innerHTML

令人困惑的部分:当在 JS 中使用赋值运算符 (=) 时,并不清楚您是在分配引用还是值(var referenceName = reference_to_thingvar 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.
  • &lt;div id="my_div" onclick="clicky(this);"&gt; 然后function clicky ( elem ) { elem.innerHTML = ...

标签: javascript innerhtml


【解决方案1】:

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"); myDivValue.innerHTML = "你好";
  • @nipponese:重新分配变量不会影响之前分配的任何内容。写var myDiv = document.getElementById("my_div"); myDiv.innerHTML = ...; 将在myDivdocument.getElementById("my_div") 指定的对象上设置innerHTML 属性;但是,例如,var myDiv = document.getElementById("my_div"); myDiv = document.getElementById("other_div"); 不会对 document.getElementById("my_div") 产生任何影响,它只会更改 myDiv 以指定不同的元素对象。
  • @nipponese:只要认为innerHTML 是字符串类型的属性:您可以在其上获取或放置字符串。另一方面,getElementById 返回一个引用,一个对象类型,就像你想的那样。
【解决方案2】:
 var myDivValue = document.getElementById("my_div").innerHTML;

存储innerHTML的值,innerHTML包含一个字符串值,而不是一个对象。所以不可能引用元素。您必须直接存储对象才能修改其属性。

var myDiVElem = document.getElementById("my_div");
myDiVElem.innerHTML = 'Hello'; // this makes the change

【讨论】:

    【解决方案3】:

    对于未来的谷歌人,我的问题是我调用了复数元素。

    document.getElementsByClassName(‘class’).innerHTML

    所以它返回一个数组而不是单个元素。我把它改成了单数。

    document.getElementByClassName(‘class’).innerHTML

    这样我就可以更新 innerHTML 值了。

    【讨论】:

    【解决方案4】:

    你应该像这样设置innerHTML值

     var myDivValue = document.getElementById("my_div").innerHTML = "Hello";
    

    【讨论】:

    • 你在哪里设置 myDivValue 以返回一个包含“Bye”的字符串,然后将 myDiVElem 重新分配为等于“Hello”
    【解决方案5】:

    设置innerHTML/outerHTML后需要重新分配元素:

    let indexInParent=[].slice.call(elem.parentElement.children).indexOf(elem);
    elem.innerHTML=innerHTML;
    elem=elem.parentElement.children[indexInParent];
    

    【讨论】:

      猜你喜欢
      • 2020-04-30
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 2018-12-10
      • 2011-01-25
      • 2022-12-31
      相关资源
      最近更新 更多