function get_nextSibling(n){
var x=n.nextSibling;
while (x && x.nodeType!=1){
x=x.nextSibling;
}
return x;
}
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)
}
首先,我们是需要确定x为n这个参数的下一个兄弟元素,并且要求它为元素节点,这样可以避免因为浏览器问题导致的空白文本节点,因此,用了while循环,x && x.nodeType!=1,是判断x是否存在,并且type是不是“不是1”
如果是“不是1”,则执行下面语句,x=x.nextSibling;,目的是跳过“不是1”的空白文本节点
如果是“是1”,则确定它为元素节点,不需要跳过,返回值为最初赋值的var x=n.nextSibling;,因为经过了while的判断,此时的x.nodeType肯定是1,因而肯定是元素节点
我想我们是被判断节点nodeType是否为1, 如是为元素节点,跳过这句话搞错了,我个人认为这句话是错的,因为我们的n是一个元素节点,所以它的下一个兄弟节点肯定也是一个元素节点,而元素节点的类型是1,while(x&&x.nodeType!=1){x=x.nextSibling;}这句话是当x的nextSibling不是元素节点的话,他就继续往下遍历,直至到最后一个兄弟节点。
谢谢,我还想再问一下既然X存在且不是元素那为什么还要让它的值为下一个值呢?
这不是第二次赋值,只是覆盖了之前的变量的值。