javascript - getElementsByClassName 和 appendChild 未按预期工作

标签 javascript html

首先,解决方案必须是纯 VanillaJS。

我有一个简单的 HTML 代码。

<div class="x">X</div>
<div class="x">Y</div>
<div class="x">Z</div>

还有一个 VanillaJS 代码。

document.addEventListener('DOMContentLoaded', function() {
    var l = document.createElement('div');
    l.innerHTML = "Hello World";
}, false);

当我尝试运行以下代码时:

document.getElementsByClassName('x')[0].appendChild(l);

我得到输出

X
Hello World
Y
Z

好吧,从技术上讲这是正确的。但是每当我尝试附加到数组的另一个成员时,它都不会按预期工作。

我试过:

document.getElementsByClassName('x')[0].appendChild(l);
document.getElementsByClassName('x')[1].appendChild(l);
document.getElementsByClassName('x')[2].appendChild(l);

预期输出:

X
Hello World
Y
Hello World
Z
Hello World

实际输出

X
Y
Z
Hello World

根据我的观察,只考虑了代码的最后一行。控制台中没有任何错误,只是无法正常工作。

我尝试了另一种重新排列数组顺序的方案。

document.getElementsByClassName('x')[1].appendChild(l);
document.getElementsByClassName('x')[2].appendChild(l);
document.getElementsByClassName('x')[0].appendChild(l);

预期输出:

X
Hello World
Y
Hello World
Z
Hello World

实际输出:

X
Hello World
Y
Z

如您所见,仅考虑最后一个追加,它不会追加到具有相同类名的其他元素上。

我也试过循环它们,还是不行。

完整代码:

<div class="x">X</div>
<div class="x">Y</div>
<div class="x">Z</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
   var l = document.createElement('div');
    l.innerHTML = "Hello World";

    document.getElementsByClassName('x')[0].appendChild(l);
    document.getElementsByClassName('x')[1].appendChild(l);
    document.getElementsByClassName('x')[2].appendChild(l);
}, false);
</script>

最佳答案

您只能创建一个元素:

var l = document.createElement('div');

当您使用 appendChild 时,如果追加的元素当前是某个其他父元素的子元素(例如第一个 x),当您将它追加到另一个元素时,它会得到从其第一个父级中删除并附加到第二个。将同一元素附加到一行中的多个父元素将导致它仅作为末尾最后一个父元素的子元素存在。

改为在每次迭代时创建一个新元素(当分配 text 而不是 HTML 时,确保分配给 textContent 属性而不是 innerHTML属性)

document.querySelectorAll('.x').forEach((x) => {
  var l = document.createElement('div');
  l.textContent = "Hello World";
  x.appendChild(l);
});
<div class="x">X</div>
<div class="x">Y</div>
<div class="x">Z</div>

关于javascript - getElementsByClassName 和 appendChild 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51073764/

相关文章:

javascript - 如何在每个 html 页面上单独执行 jQuery/Ajax 加载

javascript - 如何在 HTML 中点击时隐藏或显示 div

jquery - 当输入自动聚焦负载时 div 移动

javascript - 如何在单击按钮时将特殊字符插入到文本输入的任意位置?

javascript - JQuery 脚本中的 XOR 值

javascript - 如何为 HTML 中的 Select 元素添加阴影?

javascript - 如果我链接 .sort(), Mongoose 查询会失败

javascript - 上传时显示预览图片

javascript - Node-Red 中函数的输出在 html 中显示为 [object OBJECT]。模板

javascript - 导航菜单不适合移动浏览器