标签: htmlcollection

HTMLCollection和NodeList是否可迭代?

在ES6中,iterable是一个允许的对象for... of,并且具有Symbol.iterator键.

数组是可迭代的,就像集合和地图一样.问题是:HTMLCollectionNodeList是否可迭代?他们应该是吗?

MDN文档似乎暗示a NodeList是可迭代的.

for...of循环将在支持的浏览器for...of(如Firefox 13及更高版本)中正确循环NodeList对象

这似乎证实了Firefox的行为.

我在Chrome和Firefox中测试了以下代码,并且惊讶地发现Firefox似乎认为它们是可迭代的,但Chrome却没有.此外,火狐认为,迭代器返回的HTMLCollectionNodeList是同一个.

var col = document.getElementsByClassName('test'); // Should get HTMLCollection of 2 elems
var nod = document.querySelectorAll('.test');      // Should get NodeList of 2 elems
var arr = [].slice.call(col);                      // Should get Array of 2 elems

console.log(col[Symbol.iterator]);    // Firefox: iterator function, Chrome: undefined
console.log(nod[Symbol.iterator]);    // Firefox: iterator function, Chrome: undefined
console.log(arr[Symbol.iterator]);    // Firefox & Chrome: iterator function
console.log(col[Symbol.iterator] …
Run Code Online (Sandbox Code Playgroud)

javascript nodelist ecmascript-6 htmlcollection

21
推荐指数
2
解决办法
2352
查看次数

getElementsByClassName - 奇怪的行为

首先,抱歉我的英语不好......

我写了一个函数来改变元素类来改变它们的属性.出于某种原因,只有一些元素发生了变化,我花了几个小时才找到解决方案,但他对我来说似乎很奇怪,也许你可以向我解释一下.

function replace(){
  var elements = document.getElementsByClassName('classOne');

  for (var i = 0; i < elements.length; i++) {
    elements[i].className = 'classTwo';               
  }
}
Run Code Online (Sandbox Code Playgroud)

不能正常工作,在这里演示,[在chrome 25和FF],所以我采用了循环系数:

function replace(){
  var elements = document.getElementsByClassName('classOne');

  for (var i = 0; i < elements.length; i) { // Here’s the difference
    elements[i].className = 'classTwo';               
  }
}
Run Code Online (Sandbox Code Playgroud)

这很好用!似乎被称为"推",并且不需要系数......这是正常的吗?它与我见过的例子不同.

提前致谢!

html javascript getelementsbyclassname htmlcollection

13
推荐指数
2
解决办法
1694
查看次数

DOM中的HTMLCollection和NodeList有什么区别?

我试过我的谷歌,但我似乎找不到任何好的答案.请帮忙.

编辑:好的,所以我找到了这篇博文.所以它们来自不同的DOM级别,但除此之外它并没有多说......

dom nodelist htmlcollection

12
推荐指数
1
解决办法
2155
查看次数

element.children的console.log显示0长度,但稍后扩展时有三个条目

在我的javascript中,我有两个元素.

我记录了两个元素,它显示了......

要素1.

在此输入图像描述

要素2.

在此输入图像描述

有问题.

当我console.logelement小号.children他们显然还有些HtmlCollection小号

您将在一分钟内理解以下内容:但奇怪的是,一个HtmlCollection为空(并且长度为0),但有3个元素(并且长度为3).

如果您console.log为元素的孩子阅读下面的s,您将理解我在说什么...

元素1儿童和长度:

在此输入图像描述

元素2儿童和长度:(搞砸了)

在此输入图像描述

有谁知道这里发生了什么?

我如何解决这个问题,我需要通过HtmlCollection循环,但它不会让我因为长度是0 ...?

提前致谢!所有帮助赞赏.

html javascript htmlcollection

11
推荐指数
1
解决办法
5449
查看次数

Typescript,“ NodeListOf &lt;Element&gt;”不是数组类型或字符串类型

将我的JS转换为TS严格模式(非常头痛哈哈)

下面的语法看起来好像没什么问题,但TS在抱怨for环路上allSubMenus有:

[ts] Type 'NodeListOf<Element>' is not an array type or a string type.

我想念什么

function subAct(target:Node){

  const allSubMenus : NodeListOf<Element> = document.querySelectorAll('.subMenuItems') 

  for (const sub of allSubMenus){
    sub.classList.remove('active')
  }  
}
Run Code Online (Sandbox Code Playgroud)

javascript iteration nodelist typescript htmlcollection

9
推荐指数
3
解决办法
3820
查看次数

可以用(Symbol.iterator)for ...迭代HTMLCollections吗?

DOM4使NodeList可迭代:

interface NodeList {
  getter Node? item(unsigned long index);
  readonly attribute unsigned long length;
  iterable<Node>;
};
Run Code Online (Sandbox Code Playgroud)

根据WebIDL,这意味着

实现被声明为可迭代的接口的对象被迭代以获得一系列值.

注意:在ECMAScript语言绑定中,可迭代的接口将在其接口原型对象上具有"entries","forEach","keys","values"和 @@ iterator属性.

所以以下是可能的:

for (var el of document.querySelectorAll(selector)) ...
Run Code Online (Sandbox Code Playgroud)

我注意到在Firefox和Chrome上同样适用于HTMLCollections:

for (var el of document.getElementsByTagName(tag)) ...
Run Code Online (Sandbox Code Playgroud)

事实上,我得到了

HTMLCollection.prototype[Symbol.iterator] === [][Symbol.iterator]; // true
Run Code Online (Sandbox Code Playgroud)

但是,HTMLCollection未定义为可迭代:

interface HTMLCollection {
  readonly attribute unsigned long length;
  getter Element? item(unsigned long index);
  getter Element? namedItem(DOMString name …
Run Code Online (Sandbox Code Playgroud)

javascript dom iterable language-lawyer htmlcollection

7
推荐指数
1
解决办法
234
查看次数

使用forEach方法迭代NodeList

我想使用forEach方法迭代NodeList,我搜索了该方法,我发现解决方法是将NodeList转换为数组:

var nodesArray = Array.prototype.slice.call(nodeList);
nodesArray.forEach(function(node) { 
    //...
})
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么我们使用这种Array.prototype.slice方法?

javascript foreach nodelist slice htmlcollection

6
推荐指数
1
解决办法
2656
查看次数

如何迭代HTMLCollection?

我的HTML中有一些带有类的元素,我node-item在组件中使用以下命令访问它们:

let nodeItems = document.getElementsByClassName('node-item');
Run Code Online (Sandbox Code Playgroud)

当我记录nodeItems它给我一个HTMLCollection[]长度为4.

我尝试了很多方法,但仍无法迭代nodeItems:

1-首先尝试:

let bar = [].slice.call(nodeItems);
for (var g of bar){
    console.log(g); //gives me nothing
} 
Run Code Online (Sandbox Code Playgroud)

2秒尝试:

for(let c of <any>nodeItems) {
    console.log(c); //gives me nothing
}
Run Code Online (Sandbox Code Playgroud)

我尝试了数组迭代和对象迭代,但仍然undefinederror.还尝试过:

let nodeItems = document.querySelector(selectors);

但同样的问题.

javascript typescript htmlcollection angular

6
推荐指数
3
解决办法
7728
查看次数

document.scripts 不等于 document.getElementsByTagName("script")

document.scripts返回一个HTMLCollection包含文档中所有脚本列表的对象。同样,document.getElementsByTagName("script")返回另一个HTMLCollection对象,其中包含文档中所有脚本的列表。

我预计以下陈述是正确的,但事实并非如此。

document.scripts === document.getElementsByTagName("script") // false
Run Code Online (Sandbox Code Playgroud)

这两者不相等的原因是什么?

html javascript dom htmlcollection

6
推荐指数
2
解决办法
88
查看次数

关于 HTMLCollections 和命名属性的问题,继续使用吗?

当引用 HTML 表单中的元素时,我经常使用 name 属性的名称/值。所以,如果表单的名称是“form01”,我指的是表单的书写document.forms.form01。这是一个例子:

let title = document.forms.form01.title;
console.log(title.value);
Run Code Online (Sandbox Code Playgroud)
<form name="form01">
  <input type="text" name="title" value="Hello World">
</form>
Run Code Online (Sandbox Code Playgroud)

这是一个 HTMLCollection,但在DOM 标准 #interface-htmlcollectiondocument.forms的文档中,它没有提到在这样的集合上直接使用名称作为属性(我认为它被称为“命名属性”)的可能性 -就像我用来指代表单元素时一样。相反,文档实际上指出这是“历史文物”——那么,我应该避免使用它吗?document.forms.form01

你能帮我找到这方面的文档吗?要么它是一个可以使用的(好)功能,要么它是应该避免的东西。

html javascript standards dom htmlcollection

5
推荐指数
1
解决办法
124
查看次数