讲解哪里写着:“判断节点nodeType是否为1, 如是为元素节点,跳过。”这点是不是不对啊?
function get_nextSibling(n){
var x=n.nextSibling;
while (x && x.nodeType!=1){
x=x.nextSibling;
}
return x;
1为元素节点,上面这段代码解读应该是:x存在,且x不等于元素节点的时候x等于下一个节点在进行判断,否则直接返回x。也就是说x为元素节点的时候则返回想x,而不是“跳过”。如果我的理解是对的,那讲解那里就有误导嫌疑了。
这个答案原理是对的,利用逻辑操作符来进行判定。但是需要注意一点, x=document.getElementsByTagName("li"),得到的结果是一个关于 "li"元素的数组。 这个数组里面并不包含 空白节点。也不会出现 空白节点nodeType 为3。
当x=document.getElementsByTagName("li")[5]的时候,指示的节点是<li id="f">java</li> 里面的li元素。此时,把x带入get_nextSibling(n)函数,进行 x=x.nextSibling;运算,此时变量x会返回一个 null 值。便无法进行下面几部的操作。
因此,利用逻辑操作符&&排除掉 x=null 的情况。
&&为逻辑操作符,!=为比较操作符,比较操作符等级高于逻辑操作符,所以先进行x.nodeType!=1,判断此事件是否为真,然后判断x是否存在,如果存在也为真,最后当两个事件同时为真时,则进行while循环,即进行 x=x.nextSibling此语句操作,如果其中一个事件为假,那直接跳出循环,返回。
针对此判断有两种情况:
1)当x为元素节点时,nodeType为1,等于1,所以x.nodeType!=1此事件为假,两事件中其中一个为假,&&判断后为假,则跳出while循环,返回数值。
2)当x为空白节点时,nodeType为3,不等于1,所以x.nodeType!=1此事件为真,而x为空白节点,也为真,则&&判断后为真,进行while循环,执行x=x.nextSibling语句,然后再次判断,
如果x为元素节点,循环1)。
如果运行到最后一个空白节点后,没有下一个同级节点,则x.nextSibling返回null,此时x不存在,事件为假,进而 &&判断为假,则跳出循环,返回null值。
跳过指的是 x=x.nextSibling;不在查找下一个了
确实感觉挺误导的,但翻了下其他答案,发现跳过也可以理解为,当x是元素节点时,跳过while循环体,直接输出x。
应该是吧“!”这个去了吗
是这样子的,讲解不对。我也迷糊了好一会
li的节点类型是1,他这里判断的应该是节点是li才执行