我在阅读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不太理解
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 并不是注释中写的 node list, 而是一个 node. 我认为是注释写错了.
这个 for 循环也有问题, 只获取 nextSibling, 没有获取 previousSibling
for (; nodes; nodes = nodes.nextSibling) {
if (nodes.nodeType === 1 && nodes !== element) {
elems.push(nodes);
}
}
for 循环第一次进入的时候把自身排除掉, 因此有 nodes !== element 的判断.
nodes.nextSibling 是取下一个兄弟元素, 包括标签节点、文本节点、注释节点等。
如果改成
for (node = node.nextSibling; node; node = node.nextSibling) {
if (node.nodeType === 1) {
elems.push(node);
}
}
就不需要进行 nodes !== element 判断.
如果浏览器支持 nextElementSibling 还可以进一步优化掉 nodeType === 1 的判断.
nextElementSibling 直接取下一个标签节点
for (node = node.nextElementSibling; node; ) {
elems.push(node);
node = node.nextElementSibling;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。