getElementsByClassname 和 appendChild

Posted

技术标签:

【中文标题】getElementsByClassname 和 appendChild【英文标题】:getElementsByClass and appendChild 【发布时间】:2015-10-29 22:07:57 【问题描述】:

只是复习我的 javascript 技能并试图弄清楚为什么 getElementsByClass 不适用于我的代码。代码非常简单。单击“clicky”按钮后,脚本将创建 div 的子 h1 元素。当我使用 getElementById 并将 div 类更改为 Id 时它工作得非常好,但当我将其更改为类时它不起作用。

我已经尝试过,getElementsByClassName、getElementsByClass、getElementsByTagName 并将 div 更改为适当的属性,但没有运气。

<!doctype html>
<html>


<body>
<p>Click on button to see how appendChild works</p>

<button onclick="myFunction()">Clicky </button>

<script>
function myFunction()
var first = document.createElement("H1");
var text = document.createTextNode("Jason is pretty awesome");
first.appendChild(text);

document.getElementsByName("thistime").appendChild(first);


</script>

<div class="thistime">Hi</div>

    </body>






</html>

【问题讨论】:

您实际上是在使用getElementsByName(),而name 不是非交互式表单元素的有效属性。其次,您正在使用 NodeList 或集合,您必须对其进行迭代才能在集合中的每个元素上使用 appendChild()。然后它不会按您的意愿工作,因为您所做的只是将创建的元素插入到集合的第一个元素中,然后将其移动到第二个,然后是第三个,依此类推,直到它位于最后一个。因此,您还需要使用cloneNode 或在所述循环的每次迭代中重复创建创建的元素。 【参考方案1】:

你需要更新你的代码

document.getElementsByName("thistime").appendChild(first);

document.getElementsByClassName("thistime")[0].appendChild(first);

供参考 - https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName

工作代码 - http://plnkr.co/edit/k8ZnPFKYKScn8iYiZQk0?p=preview

【讨论】:

【参考方案2】:

你可以使用getElementsByClassName(),IE9+支持:

  document.getElementsByClassName("thistime")[0].appendChild(first);

但更好的选择可能是querySelector(),它在 IE8+ 中受支持

  document.querySelector(".thistime").appendChild(first);

请注意,querySelector() 使用 CSS 选择器语法,因此您应该在类之前放置一个点 (.)。

片段:

function myFunction() 
  var first = document.createElement("H1");
  var text = document.createTextNode("Jason is pretty awesome");
  first.appendChild(text);

  document.querySelector(".thistime").appendChild(first);
<p>Click on button to see how appendChild works</p>

<button onclick="myFunction()">Clicky</button>

<div class="thistime">Hi</div>

【讨论】:

谢谢,querySelector 似乎更有用了,我一定会更多地使用它!【参考方案3】:

如您所见,该函数名为getElementsByName,其中“elements”是复数形式。

它返回一个 list 标记名称(而不是它们的 css 类)。

您需要使用处理类名的函数,并获取数组的第一个元素,或者循环所有结果,具体取决于您要查找的内容。

【讨论】:

以上是关于getElementsByClassname 和 appendChild的主要内容,如果未能解决你的问题,请参考以下文章

getElementsByClassname 和 appendChild

document.getElementById 和 document.getElementsByClassName获取DOM元素的区别

getElementsByClassName() - 不是一个函数[关闭]

JavaScript Ultimate getElementsByClassName - 罗伯特的谈话 - 网络发展和互联网趋势

getElementsByClassName() 有两个类

getElementsByClassName( )方法