问答详情
源自:9-11 访问兄弟节点

关于判断函数的问题

    function get_nextSibling(n){

        var x=n.nextSibling;

        while (x && x.nodeType!=1){

            x=x.nextSibling;

        }

        return x;

    }


    我不太明白,当x已经被赋值了n的nextSibling,经过判断后,为什么还要再一次赋值x=x.previousSibling?

    这样的话,最后一个x的值难道不是已经变成了n的nextSibling的nextSibling了吗?

提问者:JasonYu_Law 2016-12-26 13:21

个回答

  • 慕粉3698897
    2016-12-26 14:06:17
    已采纳

    第一次x赋值了n的nextSibling,然后你要看判断的是什么。他判断的内容是x不为null,且x的节点类型不为1(即元素节点)的时候,再nextSibling一次。这里主要防止的是:有一些浏览器,会把两个元素标签中间的空格和换行符当成一个文本节点,如果你不做一次过滤,有可能因为浏览器的原因,你的nextSibling节点不是你想要的元素节点,而是一个空白的文本节点。

    所以这个判断的功能是,如果n的下一个节点是元素节点,直接返回x。如果不是元素节点(那就是存在文本节点),将这个文本节点过滤掉,即再指向下一个节点,直到找到下一个元素节点

  • qq_____暖_0
    2016-12-28 17:26:25

    function get_nextSibling(n){
           var x=n.nextSibling; // 进入函数,首先取得下一个兄弟节点
           while (x && x.nodeType!=1){ // x存在并且x不是元素节点(若不满足,说明直接找到了兄弟节点,那么就直接返回)
               x=x.nextSibling;  // 满足上述条件,进入循环体,再次取x的兄弟节点赋值给x本身
           }
           return x;
       }