亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

訪問兄弟節點的問題

570a60b10001d8e305000308.jpg

570a60b10001bf5d05000291.jpg

上面兩個截圖在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>


正在回答

4 回答

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);函數連返回值都沒有。什么都不輸出。

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

不知所語 提問者

你上面說的符合while條件,進入循環,此時循環中的x=x.nextSibling;已經是null,那么這個時候應該執行的是返回x的值,即返回null 不就會輸出嗎 我知道你的意思是說文本節點后是沒有節點的,但是現在不是在判斷最后一個li節點的兄弟節點嗎,
2016-04-11 回復 有任何疑惑可以回復我~
#2

任大人 回復 不知所語 提問者

循環體中的x=x.nextSibling為null的情況下,怎么會跳過循環執行return x ?,當不符合while條件,且while條件沒有錯的情況下才會跳出循環。執行return x; while條件中寫x&&x.nodeType!=1;當循環體重的結果為null的時候,x&&x.nodeType!=1,&&前面的x不為真,直接跳出循環,都不判斷x.nodeType!=1。但是while條件中只有x.nodeType!=1的時候,是錯誤的,程序到這里就不執行了,你試著alert(null.nodeType),什么內容都不彈。
2016-04-11 回復 有任何疑惑可以回復我~
#3

不知所語 提問者 回復 任大人

我現在明白你的意思,我也知道自己哪錯了,但是還要問一個問題,節點之間的空白符,在firefox、chrome、opera、safari瀏覽器是文本節點,這句話是之前一節練習上講到的對吧,那就是說最后一個li標簽后面還有一個文本節點,即便是這個節點的內容返回值是null,但是它的nodeTyoe不為1吧,那為什么按照我的這個思想不成立呢,不知道是哪想錯了還是,求解
2016-04-11 回復 有任何疑惑可以回復我~
#4

不知所語 提問者 回復 任大人

null是沒有nodeType的,但是既然空白符是文本節點,那就應該有nodeType啊,我覺得自相矛盾
2016-04-11 回復 有任何疑惑可以回復我~
#5

任大人 回復 不知所語 提問者

1.最后一個li標簽后面還有一個文本節點,不是這個節點的內容返回值是null,而是這個空白符沒有nextSibling屬性,因為已經是最后一個li元素了。最后一個li元素之后的空白符沒有下一個子節點,所以x.nextSibling得值為null,沒有nodeTyoe屬性。
2016-04-11 回復 有任何疑惑可以回復我~
#6

任大人 回復 不知所語 提問者

2.我給你將這個while的過程走一遍,你應該理解了while (x&&x.nodeType!=1)是不能省略x && 的。 還是按照你的代碼走,這里找的是最后一個li元素<li id="c">html</li>,也就是var x=document.getElementsByTagName("li")[2];
2016-04-11 回復 有任何疑惑可以回復我~
#7

不知所語 提問者

非常感謝!
2016-04-11 回復 有任何疑惑可以回復我~
查看4條回復
  1. 最后一個li標簽后面還有一個文本節點,不是這個節點的內容返回值是null,而是這個空白符沒有nextSibling屬性,因為已經是最后一個 li元素了。最后一個li元素之后的空白符沒有下一個子節點,所以x.nextSibling得值為null,沒有nodeTyoe屬性。

  2. 我給你將這個while的過程走一遍,你應該理解了while (x&&x.nodeType!=1)是不能省略x && 的。
    還是按照你的代碼走,這里找的是最后一個li元素<li id="c">html</li>,也就是var x=document.getElementsByTagName("li")[2]; ?

  3. 接下來進入循環:
    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,所以頁面會輸出 ‘已經是最后一個節點’
    ??? }? ? ?

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

不知所語 提問者 回復 任大人

ydyrx__214
2016-04-11 回復 有任何疑惑可以回復我~
#2

不知所語 提問者 回復 任大人

下面這個兩條橫線的
2016-04-11 回復 有任何疑惑可以回復我~
查看3條回復

回復 不知所語:接下來進入循環:
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,所以頁面會輸出 ‘已經是最后一個節點’
??? }

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

你上面說的符合while條件,進入循環,此時循環中的x=x.nextSibling;已經是null,那么這個時候應該執行的是返回x的值,即返回null 不就會輸出嗎


我知道你的意思是說文本節點后是沒有節點的,但是現在不是在判斷最后一個li節點的兄弟節點嗎,

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

舉報

0/150
提交
取消
JavaScript進階篇
  • 參與學習       468832    人
  • 解答問題       22582    個

本課程從如何插入JS代碼開始,帶您進入網頁動態交互世界

進入課程

訪問兄弟節點的問題

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號