JavaScript中的NodeList对象
任何人都可以告诉我NodeList是什么types的对象。 我读到它是一个类似数组的对象,它可以通过括号表示来访问,例如var a = someNode.childNode[0];
。 这怎么可能,因为通过括号表示法,我们只能访问一个对象的属性,而且我知道我们不能拥有
NodeList
是一个宿主对象 ,不受通常适用于本地JavaScript对象的规则的约束。 因此,您应该坚持为它logging的API,它由length
属性和通过方括号属性访问语法访问其成员组成。 您可以使用此API创build一个包含NodeList成员快照的Array
:
var nodeList = document.getElementsByTagName("div"); var nodeArray = []; for (var i = 0; i < nodeList.length; ++i) { nodeArray[i] = nodeList[i]; }
NodeList
是DOM elements
。 这就像一个数组(但不是)。 要使用它,你必须把它变成一个常规的JavaScript数组。 下面的代码片段可以帮你完成工作。
const nodeList = document.getElementsByClassName('.yourClass'), nodeArray = [].slice.call(nodeList);
NodeList不是一个核心的Javascript对象,它是由浏览器提供的DOM。 想一个函数返回一个接口到一个dynamic的或活的对象,所以forEach()是不可用的,但你可以转换成一个真正的数组有一个快照与例如
// turns nodelist into an array to enable forEach function toArray(list) { var i, array = []; for (i=0; i<list.length;i++) {array[i] = list[i];} return array; }
详情: http : //www.w3.org/TR/DOM-Level-3-Core/core.html#ID-536297177
JavaScript就像酒精一样,它可以强制:
var links = document.getElementsByTagName('a'); Array.prototype.slice.call(links).forEach(function(anchor, index, arr) { anchor.addEventListener('click', onClickFN, false); });
NodeLists是“live”,也就是说当文档结构发生变化时它们会被更新,使得它们始终保持最新的最准确的信息。 实际上,所有NodeList对象都是在访问DOM时针对DOM运行的查询。
任何时候你想迭代一个NodeList,最好是用长度初始化第二个variables,然后将迭代器与该variables进行比较:
var divs = document.getElementsByTagName("div"); for (var i=0, lens=divs.length; i < len; i++){ var div = document.createElement("div"); document.body.appendChild(div); }
NodeList是一个类似结构的数组,但实际上并不是一个数组。 您可以通过括号表示法来访问数组值。
节点列表通常作为具有filter的节点迭代器来实现。 这意味着得到一个像长度一样的属性是O(n) ,并且通过重新检查长度来重复列表将是O(n ^ 2)。
var paragraphs = document.getElementsByTagName('p'); for (var i = 0; i < paragraphs.length; i++) { doSomething(paragraphs[i]); }
相反,最好这样做:
var paragraphs = document.getElementsByTagName('p'); for (var i = 0, paragraph; paragraph = paragraphs[i]; i++) { doSomething(paragraph); }
对于所有的集合和数组,只要数组不包含被视为布尔值为false的东西,就能很好地工作。
在迭代childNodes的情况下,您也可以使用firstChild和nextSibling属性。
var parentNode = document.getElementById('foo'); for (var child = parentNode.firstChild; child; child = child.nextSibling) { doSomething(child); }
现在在ES2015中,您可以使用Array.from
方法从任何类似数组的对象创build一个Array实例,所以这应该工作:
const divList = Array.from( document.getElementsByTagName("div") );
欲了解更多信息: https : //developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/from