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了吗?
第一次x赋值了n的nextSibling,然后你要看判断的是什么。他判断的内容是x不为null,且x的节点类型不为1(即元素节点)的时候,再nextSibling一次。这里主要防止的是:有一些浏览器,会把两个元素标签中间的空格和换行符当成一个文本节点,如果你不做一次过滤,有可能因为浏览器的原因,你的nextSibling节点不是你想要的元素节点,而是一个空白的文本节点。
所以这个判断的功能是,如果n的下一个节点是元素节点,直接返回x。如果不是元素节点(那就是存在文本节点),将这个文本节点过滤掉,即再指向下一个节点,直到找到下一个元素节点
function get_nextSibling(n){
var x=n.nextSibling; // 进入函数,首先取得下一个兄弟节点
while (x && x.nodeType!=1){ // x存在并且x不是元素节点(若不满足,说明直接找到了兄弟节点,那么就直接返回)
x=x.nextSibling; // 满足上述条件,进入循环体,再次取x的兄弟节点赋值给x本身
}
return x;
}