querySelectorAll和getElementsBy*方法返回什么?

dmo*_*dmo 125 javascript dom-traversal getelementsbyclassname

getElementsByClassName(等类似的功能getElementsByTagNamequerySelectorAll)的工作方式相同getElementById,还是他们返回元素的数组?

我问的原因是因为我试图改变所有元素的样式getElementsByClassName.见下文.

//doesn't work
document.getElementsByClassName('myElement').style.size = '100px';

//works
document.getElementById('myIdElement').style.size = '100px';
Run Code Online (Sandbox Code Playgroud)

Thi*_*ter 134

您的getElementById()代码有效,因为ID必须是唯一的,因此该函数始终只返回一个元素(或者null如果没有找到).

然而,getElementsByClassName(),querySelectorAll(),和其他getElementsBy*方法返回元件的阵列状的集合.像对待真正的数组一样迭代它:

var elems = document.getElementsByClassName('myElement');
for(var i = 0; i < elems.length; i++) {
    elems[i].style.size = '100px';
}
Run Code Online (Sandbox Code Playgroud)

如果你喜欢更短的东西,可以考虑使用jQuery:

$('.myElement').css('size', '100px');
Run Code Online (Sandbox Code Playgroud)

  • “*像使用真正的数组一样对其进行迭代......*小心,*getElementsByClassName*返回一个**实时** NodeList,它可能在循环期间被意外修改,例如,如果它们选择的类名被删除。;- ) (4认同)
  • 这是否也适用于也是您域的一部分的“&lt;iframe&gt;” (2认同)
  • 现在是2018年...只需为`querySelectorAll()`创建一个包装函数,您就可以得到不错的简短代码,而无需使用大量老式的依赖。qSA(“。myElement”)。forEach(el =&gt; el.style.size =“ 100px”)`可能让包装器收到了回调。qSA(“。myElement”,el =&gt; el.style.size =“ 100px”)` (2认同)
  • “如果您希望使用更短的内容,请考虑向您的项目中添加一个巨大的库。”我知道2012年是一个不同的时代,但是即使那样,我仍然觉得这有点可笑。 (2认同)

Alv*_*oao 16

您使用的阵列为对象,之间的差getElementbyIdgetElementsByClassName是:

  • getElementbyId 会给你一个对象.
  • getElementsByClassName 会给你一个数组.

getElementsByClassName方法

getElementsByClassName(classNames)方法接受一个字符串,该字符串包含一组表示类的无序的唯一空格分隔标记.调用时,该方法必须返回一个活动NodeList对象,该活动 对象包含文档中具有该参数中指定的所有类的所有元素,并通过在空格上分割字符串来获取类.如果参数中没有指定标记,则该方法必须返回空NodeList.

https://www.w3.org/TR/2008/WD-html5-20080610/dom.html#getelementsbyclassname

的getElementById

getElementById()方法访问具有指定标识的第一个元素.

http://www.w3schools.com/jsref/met_doc_getelementbyid.asp

在你的代码中的行:

1- document.getElementsByClassName('myElement').style.size ='100px';

按预期方式工作,就算是getElementByClassName会返回一个数组,数组将拥有style产权,你要访问的每个element通过遍历他们.

这就是函数getElementById为您工作的原因,此函数将返回直接对象,因此您将能够访问该style属性.


rem*_*tec 11

以下描述取自此页面:

getElementsByClassName()方法返回具有指定类名的文档中所有元素的集合,作为NodeList对象.

NodeList对象表示节点的集合.可以通过索引号访问节点.索引从0开始.

提示:您可以使用NodeList对象的length属性来确定具有指定类名的元素数,然后您可以遍历所有元素并提取所需的信息.

因此,作为参数getElementsByClassName将接受类名.

如果这是您的HTML正文:

<div id="first" class="menuItem"></div>
<div id="second" class="menuItem"></div>
<div id="third" class="menuItem"></div>
<div id="footer"></div>
Run Code Online (Sandbox Code Playgroud)

然后var menuItems = document.getElementsByClassName('menuItem')将返回3个上部<div>s 的集合(不是数组),因为它们匹配给定的类名.

然后,您可以使用以下命令迭代此节点(<div>在本例中为s)集合:

for (var menuItemIndex = 0 ; menuItems.length ; menuItemIndex ++) {
   var currentMenuItem = menuItems[menuItemIndex];
   // do stuff with currentMenuItem as a node.
}
Run Code Online (Sandbox Code Playgroud)

有关元素和节点之间差异的更多信息,请参阅此帖子.


kin*_*ser 10

ES6提供了Array.from()方法,该方法从类似数组或可迭代的对象创建新的Array实例.

let boxes = document.getElementsByClassName('box');

Array.from(boxes).forEach(v => v.style.background = 'green');
console.log(Array.from(boxes));
Run Code Online (Sandbox Code Playgroud)
.box {
  width: 50px;
  height: 50px;
  margin: 5px;
  background: blue;
  display: inline-block;
}
Run Code Online (Sandbox Code Playgroud)
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
Run Code Online (Sandbox Code Playgroud)

正如您在代码片段中看到的那样,在使用Array.from()函数之后,您可以对每个元素进行操作.


使用相同的解决方案jQuery.

$('.box').css({'background':'green'});
Run Code Online (Sandbox Code Playgroud)
.box {
  width: 50px;
  height: 50px;
  margin: 5px;
  background: blue;
  display: inline-block;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
Run Code Online (Sandbox Code Playgroud)


Thi*_*ous 6

换一种说法

  • document.querySelector()仅选择指定选择器的第一个元素.因此它不会吐出一个数组,它只是一个值.类似于document.getElementById()仅提取ID元素,因为ID必须是唯一的.

  • document.querySelectorAll()选择具有指定选择器的所有元素并将它们返回到数组中.与document.getElementsByClassName()类和document.getElementsByTagName()标签类似.


为什么要使用querySelector?

它仅用于简单和简洁的唯一目的.


为什么要使用getElement/sBy?*

性能更快.


为什么这种性能差异?

两种选择方式都旨在创建NodeList以供进一步使用. querySelectors使用选择器生成静态NodeList,因此必须首先从头创建它.
getElement/sBy*立即调整当前DOM的现有实时NodeList.

那么,何时使用哪种方法取决于您/您的项目/设备.


相关信息

演示所有方法
NodeList文档
性能测试


ati*_*kan 5

它返回类似数组的列表。

你把它作为一个数组作为例子

var el = getElementsByClassName("elem");
el = Array.prototype.slice.call(el); //this line
el[0].appendChild(otherElem);  
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以通过运行获得单个元素

document.querySelector('.myElement').style.size = '100px';
Run Code Online (Sandbox Code Playgroud)

但它适用于类 .myElement 的第一个元素。

如果您想将此应用于该类的所有元素,我建议您使用

document.querySelectorAll('.myElement').forEach(function(element) {
    element.style.size = '100px';
});
Run Code Online (Sandbox Code Playgroud)


小智 5

/*
 * To hide all elements with the same class, 
 * use looping to reach each element with that class. 
 * In this case, looping is done recursively
 */

const hideAll = (className, i=0) => {
if(!document.getElementsByClassName(className)[i]){ //exits the loop when element of that id does not exist
  return; 
}

document.getElementsByClassName(className)[i].style.visibility = 'hidden'; //hide element
return hideAll(className, i+1) //loop for the next element
}

hideAll('appBanner') //the function call requires the class name
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

76955 次

最近记录:

5 年,9 月 前