这个函数的定义不太明白,希望大牛指点

我在阅读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不太理解

阅读 1.8k
2 个回答
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;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题