不知所语
2016-04-10 22:22
上面两个截图在while语句中的条件我已经圈出来了,为什么两个运行的结果一个可以显示“已经是最后一个节点”,另一个却没有执行到这一步
!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>nextSibling</title> </head> <body> <ul id="u1"> <li id="a">javascript</li> <li id="b">jquery</li> <li id="c">html</li> </ul> <ul id="u2"> <li id="d">css3</li> <li id="e">php</li> <li id="f">java</li> </ul> <script type="text/javascript"> function get_nextSibling(n){ var x=n.nextSibling; while (x&&x.nodeType!=1){ alert(x.nextSibling); } return x; } var x=document.getElementsByTagName("li")[2]; document.write(x.nodeName); document.write(" = "); document.write(x.innerHTML); var y=get_nextSibling(x); if(y!=null){ document.write("<br />nextsibling: "); document.write(y.nodeName); document.write(" = "); document.write(y.innerHTML); }else{ document.write("<br>已经是最后一个节点"); } </script> </body> </html>
22行的结果为null, var x=document.getElementsByTagName("li")[2];的下一个节点在火狐中是空白符属于文本节点,符合while条件,会进入循环,循环中x=x.nextSibling; 此时x.nextSibling已近为null,如果while中加上x && ,判断x为真才执行,此时为null,所以不执行,跳出循环执行return x; 如果你while条件不判断x是否为真,只有x.nodeType!=1的话,此时的while循环已经出错了,因为null没有nodeType属性,下面的return x ;都不执行。var y=get_nextSibling(x);函数连返回值都没有。什么都不输出。
最后一个li标签后面还有一个文本节点,不是这个节点的内容返回值是null,而是这个空白符没有nextSibling属性,因为已经是最后一个 li元素了。最后一个li元素之后的空白符没有下一个子节点,所以x.nextSibling得值为null,没有nodeTyoe属性。
我给你将这个while的过程走一遍,你应该理解了while (x&&x.nodeType!=1)是不能省略x && 的。
还是按照你的代码走,这里找的是最后一个li元素<li id="c">html</li>,也就是var x=document.getElementsByTagName("li")[2];
接下来进入循环:
var y=get_nextSibling(x);//将最后一个li元素x作为参数传入函数get_nextSibling()
function get_nextSibling(n){
var x=n.nextSibling;//假设在火狐浏览器,这里的nextSibling为空白符,属于文本节点,nodeType=3
while (x&&x.nodeType!=1){ //文本节点有nodeType属性,所以while(x)为真,3!=1也成立,继续执行
x=x.nextSibling;//空白符之后没有li元素了,所以x.nextSibling=null,将x=null继续传入while条件中作
判断,其中while(x)就不满足,null相当于!x,所以不在执行循环体中的代码,x=null就是此次循环的结果。如果你这里while中只写
while(x.nodeType!=1),就出错了,null没有这个属性。出错之后下面的rerun x将不在执行。所以你页面中什么都不输出
}
return x;//相当于return null,所以页面会输出 ‘已经是最后一个节点’
}
回复 不知所语:接下来进入循环:
var y=get_nextSibling(x);//将最后一个li元素x作为参数传入函数get_nextSibling()
function get_nextSibling(n){
var x=n.nextSibling;//假设在火狐浏览器,这里的nextSibling为空白符,属于文本节点,nodeType=3
while (x&&x.nodeType!=1){ //文本节点有nodeType属性,所以while(x)为真,3!=1也成立,继续执行
x=x.nextSibling;//空白符之后没有li元素了,所以x.nextSibling=null,将x=null继续传入while条件中作判断,其中while(x)就不满足,null相当于!x,所以不在执行循环体中的代码,x=null就是此次循环的结果。如果你这里while中只写while(x.nodeType!=1),就出错了,null没有这个属性。出错之后下面的rerun x将不在执行。所以你页面中什么都不输出
}
return x;//相当于return null,所以页面会输出 ‘已经是最后一个节点’
}
你上面说的符合while条件,进入循环,此时循环中的x=x.nextSibling;已经是null,那么这个时候应该执行的是返回x的值,即返回null 不就会输出吗
我知道你的意思是说文本节点后是没有节点的,但是现在不是在判断最后一个li节点的兄弟节点吗,
JavaScript进阶篇
468190 学习 · 21891 问题
相似问题