English 中文(简体)
获取元素By* 的方法返回什么?
原标题:What do querySelectorAll and getElementsBy* methods return?

getEplementsByClassName (以及类似功能,如 getEplementsByTagName querySelectorAll ) 是否与 getEplementById 相同,或者它们返回一个元素阵列?

我之所以要问,是因为我正试图用 getElementsByClassName 来改变所有元素的样式。 见下文。

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

//works
document.getElementById( myIdElement ).style.size =  100px ;
最佳回答

您的< a href=' "https:// developmenter.mozilla.org/en-US/docs/Web/API/Document/getElementById" rel="norefrer"\ code>getElementById 代码,因为ID必须是独一无二的, 因此, 函数总是返回一个元素( 如果找不到, 则返回 < code> null ) 。

However, the methods getElementsByClassName, getElementsByName, getElementsByTagName, and getElementsByTagNameNS return an iterable collection of elements.

方法名称提供提示 : getEplement 意味着 singulal ,而 getEplements 意味着plual

方法.childNodes 产生 lives NodeList https://developer.mozilla.org/en-US/docs/Web/API/Element/children" rel="noreferr"\code>.child .child live ,因此这两只捉者也需要小心处理。


有些图书馆,例如>>jQuery ,使DOM查询时间短一些,在“一个要素”和“要素汇编”上产生一层抽象:

$(".myElement").css("size", "100px");
问题回答

You are using a array as an object, the difference between getElementbyId and getElementsByClassName is that:

  • getElementbyId will return an Element object or null if no element with the ID is found
  • getElementsByClassName will return a live HTMLCollection, possibly of length 0 if no matching elements are found

getElementsByClassName

The getElementsByClassName(classNames) method takes a string that contains an unordered set of unique space-separated tokens representing classes. When called, the method must return a live NodeList object containing all the elements in the document that have all the classes specified in that argument, having obtained the classes by splitting a string on spaces. If there are no tokens specified in the argument, then the method must return an empty NodeList.

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

getElementById

获得元素ById () 方法以指定的 ID 进入第一个元素 。

https:// developmenter.mozilla.org/en-US/docs/Web/API/Document/getElementById" rel=“noreferr'>https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById

在您的代码行中:

- 文件 1 。 getE元素ByClassName (我的元素). stype. size = 100px;

将按预期进行 < enger> NOT < / strong > 工作, 因为 < code> getEplementByClassName 将返回一个数组, 而数组将返回一个数组, 数组将返回 < enger> NOT 拥有 < code > 样式 属性, 您可以通过它们循环访问每个 < code> element 。

s 这就是为什么函数getEplementById 为您工作的原因, 此函数会返回直接对象。 因此您可以访问 stype 属性 。

以下描述摘自"http://www.w3schools.com/jsref/met_document_getelementsby slearname.asp" rel=“没有跟随无悔者”>此页:

获得元素ByClassName () 的方法返回文档中包含指定类名的所有元素的集合, 作为节点列表对象 。

The NodeList object represents a collection of nodes. The nodes can be accessed by index numbers. The index starts at 0.

提示 : 您可以使用节点列表对象的长度属性来确定带有指定类别名称的元素数量, 然后您可以环绕所有元素并提取您想要的信息 。

因此,作为参数 getE元素ByClassName 将接受一个类名 。

如果这是您的 HTML 身体 :

<div id="first" class="menuItem"></div>
<div id="second" class="menuItem"></div>
<div id="third" class="menuItem"></div>
<div id="footer"></div>

然后 var 菜单项目 =文档。 getElementsByClassName (菜单项) 将返回3个上端 的收藏( 不是数组), 因为它们符合给定的类名 。

然后您可以在此节点( in this case) 收藏中复制 :

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

请参看“https://stackoverflow.com/ questions/9979172/difference-we间-node-object-and-element-object>,以了解关于元素和节点之间差异的更多情况。

其它词 < 强/ 强 > < 强/ 强 >

  • document. exector () > 只选择指定选择器中的第一个 < strong > one 元素。 所以它不吐出一个数组, 它是一个单值。 类似于 document. getElementById () , 只获取 ID 元素, 因为 ID 必须是独一无二的 。

  • document.querySelectorAll () 选择有指定选择器的 all 元素, 并在一个阵列中返回它们。 类似 document. getElementsByClassName () for class and document. getElementsByTagName () tag () 标签仅用于分类和 < code> documents > 。


<强> 为什么要使用查询选择器?

它仅用于简单易行和简便的目的。


为何使用获取元素/ sBy? @ {%/ strength >

更快的业绩。


“强”为什么性能有差异?“/强”

Both ways of selection has the purpose of creating a NodeList for further use. querySelectors generates a static NodeList with the selectors thus it must be first created from scratch.
getElement/sBy* immediately adapts the existing live NodeList of the current DOM.

所以,什么时候使用哪种方法 取决于你/你的项目/你的设备。


<强>Infos

Demo of all methods
NodeList Documentation
Performance Test

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

document.querySelector( .myElement ).style.size =  100px ;

但它将适用于第一个元素 与等级。 我的元素。

如果你愿意将这个应用到所有元素 与班级,我建议你使用

document.querySelectorAll( .myElement ).forEach(function(element) {
    element.style.size =  100px ;
});

它返回类似阵列的清单 。

< 强度 > 您将矩阵作为示例

var el = getElementsByClassName("elem");
el = Array.prototype.slice.call(el); //this line
el[0].appendChild(otherElem);  
/*
 * 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

使用任何支持 ES5+ 的浏览器( 基本上高于 IE8 的任何浏览器), 您可以使用 < code> Array. prototype. forEach 方法 。

Array.prototype.forEach.call(document.getElementsByClassName( answer ), function(el) {
    el.style.color=  red ;
});

< a href=>""https://caniuse.com/mdn-javascript_ buildingins_array_foreach" rel="不跟随 nofollow noreferrer" >caniuse 源

因此,我被告知,这是我问题的一个复制品,我应该删除我的问题,我将这样做,这样我就可以使论坛保持干净,保持提问的权利。

由于我认为我和这个问题确实不同,我将指出我的答案,因此我将完成这一页的知识,信息不会丢失。

<强问/强>

  1. 我在片段有一个代码, 它有一个 document.getElementsByClassName (“ close”) [0] , [0] 正在做什么?

  2. 我从未见过在 getEplementsByClassName 中使用方括号是为了什么目的?

  3. 还有,我怎么把它转换成jQuery?

< 强 > 反响

  1. 片断中的代码有一个 < code> [0] 代码,它实际上被用作数组使用,而它是 0,它指的是首次使用指定的类别。

  2. 上面也一样

  3. 我无法真正做到这一点, 也没有人回答 。 在提到 < code> event. target 的代码部分中, 目标 我无法使用 < code>$( "我的摩尔" ) 而不是 document. getElementById ("我的摩尔") , 我认为它们应该等同, 但在这种情况下, 替换标准格式的 jQuery 形式将不会产生预期的效果 。

    window.onclick = function(event) {
      if (event.target == modal) {
        modal.style.display = "none";
      }
    }

var modal = document.getElementById("myModal");
var btn = document.getElementById("myBtn");
var span = document.getElementsByClassName("close")[0];

btn.onclick = function() {
  modal.style.display = "block";
}
span.onclick = function() {
  modal.style.display = "none";
}
window.onclick = function(event) {
  if (event.target == modal) {
    modal.style.display = "none";
  }
}
body {font-family: Arial, Helvetica, sans-serif;}

.modal {
  display: none;
  position: fixed;
  z-index: 1;
  padding-top: 100px;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  overflow: auto;
  background-color: rgb(0,0,0);
  background-color: rgba(0,0,0,0.4);
}

.modal-content {
  background-color: #fefefe;
  margin: auto;
  padding: 20px;
  border: 1px solid #888;
  width: 80%;
}

.close {
  color: #aaaaaa;
  float: right;
  font-size: 28px;
  font-weight: bold;
}

.close:hover,
.close:focus {
  color: #000;
  text-decoration: none;
  cursor: pointer;
}
<h2>Modal </h2>

<button id="myBtn">Open Modal</button>

<div id="myModal" class="modal">
  <div class="modal-content">
    <span class="close">&times;</span>
    <p>Some text in the Modal..</p>
  </div>
</div>

<强 > 更新

似乎我不能删除我的问题 人们对此不满意 我真的不知道我该做什么

超级旧学校解决方案 :

        [].forEach.call(document.getElementsByClassName( myClass ), function (el) {
            el.style.size =  100px ;
        });

对 Drenzii s 具体案例 < / strong > 的回答 < enger >.

您可以使 < strong > a 函数对 < code > word 元素 中的任何元素 有效, 并传递您想要变换的元素的数量, 例如 :

// Binds `wordButtons` to an (array-like) HTMLCollection of buttons
const wordButtons = document.getElementsByClassName("word");

// Applies the `slantWord` function to the first word button
slantWord(1);

// Defines the `slantWord` function
function slantWord(wordNumber) {
  const index = wordNumber - 1; // Collection index is zero-based
  wordButtons[index].style.transform = "rotate(7deg)"; // Transforms the specified button
}
<div class="wordGameContainer">
  <button class="word word1">WORD 1</button>
  <button class="word word2">WORD 2</button>
  <button class="word word3">WORD 3</button>
  <button class="word word4">WORD 4</button>
</div>

<div>
  <button onclick="moveWord()" class="playButton">PLAY</button>
</div>




相关问题
selected text in iframe

How to get a selected text inside a iframe. I my page i m having a iframe which is editable true. So how can i get the selected text in that iframe.

How to fire event handlers on the link using javascript

I would like to click a link in my page using javascript. I would like to Fire event handlers on the link without navigating. How can this be done? This has to work both in firefox and Internet ...

How to Add script codes before the </body> tag ASP.NET

Heres the problem, In Masterpage, the google analytics code were pasted before the end of body tag. In ASPX page, I need to generate a script (google addItem tracker) using codebehind ClientScript ...

Clipboard access using Javascript - sans Flash?

Is there a reliable way to access the client machine s clipboard using Javascript? I continue to run into permissions issues when attempting to do this. How does Google Docs do this? Do they use ...

javascript debugging question

I have a large javascript which I didn t write but I need to use it and I m slowely going trough it trying to figure out what does it do and how, I m using alert to print out what it does but now I ...

Parsing date like twitter

I ve made a little forum and I want parse the date on newest posts like twitter, you know "posted 40 minutes ago ","posted 1 hour ago"... What s the best way ? Thanx.