为了账号安全,请及时绑定邮箱和手机立即绑定

一直捋不顺方法里对X的赋值,为什么要两次赋值呢?在IE中不会变成下两个节点么?

 function get_nextSibling(n){

        var x=n.nextSibling;

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

            x=x.nextSibling;

        }

        return x;

    }


正在回答

5 回答

 function get_nextSibling(n){

        var x=n.nextSibling; ------------> 这里是检测又没有下一个兄弟节点,无则赋null值

【说明下:1.这个x有可能返回的是空格符即为文本节点,nodeTpye=3;2.这个x有可能是返回null】

        while (x && x.nodeType!=1){ ----------> 当有下一个兄弟节点但他的兄弟节点不是元素节点

            x=x.nextSibling;  -------->则继续读一下个子节点,并赋值给x

        }

        return x;----------->返回第一次调用函数的值(可能是文本节点,nodeType=3,也可能是null)

    }


0 回复 有任何疑惑可以回复我~
#1

慕盖茨2022422 提问者

非常感谢!
2016-09-12 回复 有任何疑惑可以回复我~

首先,我们是需要确定x为n这个参数的下一个兄弟元素,并且要求它为元素节点,这样可以避免因为浏览器问题导致的空白文本节点,因此,用了while循环,x && x.nodeType!=1,是判断x是否存在,并且type是不是“不是1”

如果是“不是1”,则执行下面语句,x=x.nextSibling;,目的是跳过“不是1”的空白文本节点


如果是“是1”,则确定它为元素节点,不需要跳过,返回值为最初赋值的var x=n.nextSibling;,因为经过了while的判断,此时的x.nodeType肯定是1,因而肯定是元素节点

0 回复 有任何疑惑可以回复我~

我想我们是被判断节点nodeType是否为1, 如是为元素节点,跳过这句话搞错了,我个人认为这句话是错的,因为我们的n是一个元素节点,所以它的下一个兄弟节点肯定也是一个元素节点,而元素节点的类型是1,while(x&&x.nodeType!=1){x=x.nextSibling;}这句话是当x的nextSibling不是元素节点的话,他就继续往下遍历,直至到最后一个兄弟节点。

0 回复 有任何疑惑可以回复我~
#1

慕盖茨2022422 提问者

对没错就是这个意思,就想知道为什么不是 while (x && x.nodeType==1){ x=x.nextSibling;}
2016-09-06 回复 有任何疑惑可以回复我~
#2

qq_Mark单_0

回复 革命遥遥无期我觉得就是被注意的那句话误导了,只要不是元素节点他就是会一直往后面检测即nextSibling,你现在看了http://www.imooc.com/video/2140这页的知识了吗,我一直搞不清楚!
2016-09-09 回复 有任何疑惑可以回复我~
#3

Airly

为什么n是元素节点下一个子节点就一定是元素节点呢,下一个子节点也有可能是文本节点啊,因为你看明明后面紧接的是空白的换行符,而浏览器默认这个为文本节点。所以,那里判断是否为元素节点的用途就是,如果不是元素节点就访问下一个子节点,如果是的话就返回当前访问到的节点。
2016-09-12 回复 有任何疑惑可以回复我~
#4

慕盖茨2022422 提问者 回复 qq_Mark单_0

当X不等1的时候说明X值是一个文本(空隔)既然是个空格我们就该跳过它(让X值为下一个兄弟节点),如果X=1则说明X所获取到的值为元素就不需要继续向下寻找了直接返回X
2016-09-12 回复 有任何疑惑可以回复我~
#5

Airly 回复 慕盖茨2022422 提问者

是的,就是你理解的这个意思。
2016-09-12 回复 有任何疑惑可以回复我~
查看2条回复

谢谢,我还想再问一下既然X存在且不是元素那为什么还要让它的值为下一个值呢?

0 回复 有任何疑惑可以回复我~

这不是第二次赋值,只是覆盖了之前的变量的值。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

一直捋不顺方法里对X的赋值,为什么要两次赋值呢?在IE中不会变成下两个节点么?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信