我在阅读appframework.js中的源码时,下面这个函数中有些语句不明白
/**
* Given a set of nodes, it returns them as an array. Used to find
* siblings of an element
* @param {Nodelist} nodes Node list to search
* @param {Object=} element [optional] objects to find siblings off of
* @return {Array} array of siblings
* @api private
*/
var nundefined;
function siblings(nodes, element) {
var elems = [];
if (nodes == nundefined)
return elems;
for (; nodes; nodes = nodes.nextSibling) {
if (nodes.nodeType === 1 && nodes !== element) {
elems.push(nodes);
}
}
return elems;
}
nodes应该是一个元素集合,nodes.nextSibling及nodes !== element不太理解
从逻辑上看 nodes 并不是注释中写的 node list, 而是一个 node. 我认为是注释写错了.
这个 for 循环也有问题, 只获取 nextSibling, 没有获取 previousSibling
for 循环第一次进入的时候把自身排除掉, 因此有 nodes !== element 的判断.
nodes.nextSibling 是取下一个兄弟元素, 包括标签节点、文本节点、注释节点等。
如果改成
就不需要进行 nodes !== element 判断.
如果浏览器支持 nextElementSibling 还可以进一步优化掉 nodeType === 1 的判断.
nextElementSibling 直接取下一个标签节点