javascript - 这个函数的定义不太明白,希望大牛指点
巴扎黑
巴扎黑 2017-04-11 10:15:50
[JavaScript讨论组]

我在阅读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)
大家讲道理
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;
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号