开发者社区> 问答> 正文

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

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

展开
收起
a123456678 2016-03-13 18:24:29 2012 0
1 条回答
写回答
取消 提交回答
  • 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;
    }
    2019-07-17 19:02:58
    赞同 展开评论 打赏
问答分类:
API
问答地址:
问答排行榜
最热
最新

相关电子书

更多
数据+算法定义新世界 立即下载
Android插件化-从入门到"放弃" 立即下载
Go语言路上踩过的坑 立即下载