節點查找以及節點遍歷:兩種方式


 

遍歷節點的方式叫做:API  這里有兩個套API

即:HTML元素。

//===========================以下是第一種操作DOM的API,會把空文本節點計算在內。相比下面的第二套API兼容性會好點=========================
//在控制台獲取對象時:點擊所獲取的對象在firefox中顯示各種屬性,在chrome中是顯示其子元素以及孫子元素的所有內容。
DOM節點操作,標簽之間的換行空文本節點在IE瀏覽器和firefox火狐瀏覽器中會讀取,其他瀏覽器不會讀取,需要兼容性方法,見搜狗:遍歷節點
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="js/domready.js"></script><!--必須導入該文件,搜狗輸入domready.js-->
    <script>
      //===========================這里獲得的所有對象都是可以點開查看各種屬性=============================
        myReady(function(){
            var ul=document.getElementById('ul1');
            var li1=document.getElementById("one");
            var li2=document.getElementById("two");
            var li3=document.getElementById("three");
            //console.log(document.childNodes[0]);//獲取文檔第一個子節點:<!DOCTYPE html>對象 ,點開可以看到各種屬性及屬性值(火狐),在谷歌中顯示的是:所獲取對象下面的所有子元素內容。
            //console.log(document.firstChild);//獲取文檔第一個子節點:<!DOCTYPE html>對象 ,點開可以看到各種屬性及屬性值(火狐),在谷歌中顯示的是:所獲取對象下面的所有子元素內容。
            //console.log(document.childNodes.item(0));//獲取文檔第一個子節點:<!DOCTYPE html>對象 ,點開可以看到各種屬性及屬性值(火狐),在谷歌中顯示的是:所獲取對象下面的所有子元素內容。
            //console.log(document.childNodes[0].tagName);//獲取文檔第一個子節點:<!DOCTYPE html>對象的標簽名稱:undefined
            //console.log(document.firstChild.tagName);//獲取文檔第一個子節點:<!DOCTYPE html>對象的標簽名稱:undefined

            //console.log(document.documentElement);//文檔根節點:html對象,點開可以看到各種屬性及屬性值
            //console.log(document.documentElement.tagName);//html標簽名稱
            
            //console.log(document.documentElement.firstChild);//獲取HTML的第一個子節點:head對象,點開可以看到各種屬性及屬性值(火狐),在谷歌中顯示的是:所獲取對象下面的所有子元素內容。
            //console.log(document.documentElement.lastChild);//獲取HTML的最后一個子節點:body對象,點開可以看到各種屬性及屬性值(火狐),在谷歌中顯示的是:所獲取對象下面的所有子元素內容。
            //console.log(document.documentElement.firstChild.tagName);//獲取HTML的第一個子節點的標簽名稱:head
            //console.log(document.documentElement.lastChild.tagName);//獲取HTML的最后一個子節點的標簽名稱:body

            var ul=document.getElementById("ul1");
            //獲得第一個和最后一個子節點有三種方式:
            //console.log(ul.firstChild);//空文本子節點
            //console.log(ul.childNodes[0]);//空文本子節點
            //console.log(ul.childNodes.item(0));//空文本子節點
            
            var ul=document.getElementById("ul1");
            //獲得除了第一個和最后一個之外的節點有兩種方式:
            //console.log(ul.childNodes[1]);
            //console.log(ul.childNodes.item(1));

            var li=document.getElementById("twoLi");//獲取li對象
            //console.log(li.tagName);//獲得li標簽的名稱
            //console.log(li.nextSibling);//因為下面每個li都有換行,所以左右兄弟節都是空文本節點,所以這里顯示:#text,謹記。
            //console.log(li.previousSibling);//因為下面每個li都有換行,所以左右兄弟節都是空文本節點,所以這里顯示:#text,謹記。
            
            var a=document.getElementById("onea");//獲取a對象
            //console.log(a.nextSibling);//獲取下一個兄弟對象: <span>333</span>
            //console.log(a.previousSibling);//獲取上一個兄弟對象: <a href="">1111</a>

            var ul=document.getElementById("ul1");//獲取ul對象
            var a=document.getElementById("onea");//獲取a對象
            //console.log(ul.parentNode);//獲得父節點  div
            //console.log(a.parentNode);//獲得父節點  li

            var ul=document.getElementById("ul1");//獲取ul對象
            var a=document.getElementById("onea");//獲取a對象
            //console.log(ul.ownerDocument===document);
            //console.log(ul.ownerDocument===document);
            //console.log(document);//顯示:HTMLDocument file:///D:/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/HTML/%E4%BD%9C%E4%B8%9A%E7%B4%A0%E6%9D%90/textTwo.html  表示獲取該文件的絕對路徑。

            var ul=document.getElementById("ul1");//獲取ul對象
            var a=document.getElementById("onea");//獲取a對象
            var span1=document.getElementById("span1");//獲取span對象
            var span2=document.getElementById("span2");//獲取span對象
            console.log(ul.hasChildNodes());//返回:true. 有3個li子節點
            console.log(a.hasChildNodes());//返回:true.  有"2222"文本子節點
            console.log(span1.hasChildNodes());//返回:true 有空文本子節點,即:有一個空格
            console.log(span2.hasChildNodes());//返回:false 沒有節點
        })
    </script>
</head>
<body id="body">
    <div id="div">
        <ul id="ul1">
            <li id="oneLi"><a href="">1111</a><a href="" id="onea">22222</a><span id="span1"> </span> <span id="span2"></span></li>
            <li id="twoLi"><a href="">4444</a><a href="" >5555</a><a href="">6666</a></li>
            <li id="threeLi"><a href="">7777</a><a href="" >8888</a><a href="">9999</a></li>
        </ul>
        <ul id="ul2">
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </div>
</body>


以下在控制台獲取對象時:點擊所獲取的對象在firefox中顯示各種屬性,在chrome中是顯示其子元素以及孫子元素的所有內容。

====================================以下是第一種 API 遍歷方法 一 ===========================================
第一種API 遍歷文本節點注重的是文本節點,忽略空的文本節點。兼容性比較好。
遍歷文檔所有節點,並且打印出來
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="js/domready.js"></script><!--必須導入該文件,搜狗輸入domready.js-->
    <script>
        myReady(function(){
            var s="";
            function travel(spance,node){
                debugger;
                if (node.tagName) {//判斷當前節點是否是空標簽,不是就添加html標簽名稱。
                    s+=spance+node.tagName+"<br/>";
                }
                var len= node.childNodes.length;//獲得所有子節點個數
                for (var i = 0; i < len; i++) {
                    travel(spance+"|-",node.childNodes[i])
                }
            }
            travel("",document);
            document.write(s);
        })
    </script>
<body>
    <div>
        <ul id="ul1">
            <li><a href="">111</a></li>
            <li><a href="">111</a></li>
            <li><a href="">111</a></li>
        </ul>
        <ul id="ul2">
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </div>
</body>

-------替換上面,這是自己編寫的,僅僅用於遞歸遍歷所有節點名稱---------
myReady(function(){
    var str="";//存儲打印在文檔的字符串
    /**
     * 遞歸查找文本所有節點名稱
     * @param  {標簽對象} node 標簽
     * @return {string}      打印的文本
     */
    function travel(node){
       if (node.nodeType==1) {//node.nodeType==1,則不為空;node.nodeType==0,則返回空。
           str+=node.tagName+"--";//讀取每個節點的名稱,這個遞歸需要做的只有讀取節點名稱
       }
       for (var i = 0; i < node.childNodes.length; i++) {//遍歷當前節點的所有子節點
           travel(node.childNodes[i]);//所有子節點進行遞歸
       }
    }
    travel(document);//document是當前文檔:從html開始。
    document.write(str);//打印字符串
})
-------------------------------------
重點:node.nodeType==1,表示非空節點,node.nodeType==0,表示空文本節點(換行)
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>節點遍歷</title>
  <script src="js/domready.js"></script><!--必須導入該文件,搜狗輸入domready.js-->
  <script>
      myReady(function(){
        var p=document.getElementById('p');//獲取div對象
        for (var i=0,len=p.childNodes.length; i<len; i++) {//聲明兩個變量可以用逗號分開

            //node.nodeType==1,表示非空節點,node.nodeType==0,表示空文本節點(換行)
            //如果沒有進行if判斷,直接輸出:console.log(p.childNodes[i]); 控制台顯示:#text <span> #text <span> #text <span> #text。
            //總共7個對象,四個#text(空文本節點),所以要使用node.nodeType==1,篩選出非空節點進行輸出。
            if (p.childNodes[i].nodeType==1) {
                debugger;
                //console.log(p.childNodes[i]);//這兩句話分開打印。獲取標簽對象。
                document.write(p.childNodes[i].tagName+"<br/>");//這兩句話分開打印。獲取標簽的名稱。
            }
        }
      });
  </script>
</head>
<body>
    <p id="p">
      <span>
        <a href=""></a>
        <a href=""></a>
        <a href=""></a>
      </span>
      <span>
        <a href=""></a>
        <a href=""></a>
        <a href=""></a>
      </span>
      <span>
        <a href=""></a>
        <a href=""></a>
        <a href=""></a>
      </span>
    </p>
  </div>
</body>
</html>
--------------------
      第一種API 遍歷文本節點注重的是所有DOM節點,忽略空的文本節點。兼容性比較好。

====================================以上是第一種 API 遍歷方法 一 ===========================================


====================================以下是第二種 API 遍歷方法 二 ===========================================
      第二套API是比較專門針對文本DOM節點進行開發的,所以每個屬性都帶有element(元素),除了children[i]

      第二種API 遍歷文本節點注重的是標簽對象節點,忽略空的文本節點。兼容性相對差一點,IE8以及IE8以下不支持,其他瀏覽器兼容性比較好。
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Document</title>
          <script src="js/domready.js"></script><!--必須導入該文件,搜狗輸入domready.js-->
          <script>
              myReady(function(){
                  var ul=document.getElementById('ul1');//獲取對象
                  for (var i=0,len=ul.childElementCount; i<len; i++) {//遍歷對象下面的所有子節點,空文本節點忽略(換行)
                    console.log(ul.children[i]);//輸出子節點名稱,這兩個輸出要分開,否則只能顯示一個。
                    //document.write(ul.children[i].tagName+"<br/>");//輸出子節點名稱,這兩個輸出要分開,否則只能顯示一個。
                  }
              })
          </script>
      <body>
          <div>
              <ul id="ul1">
                  <li><a href="">111</a></li>
                  <li><a href="">111</a></li>
                  <li><a href="">111</a></li>
              </ul>
              <ul id="ul2">
                  <li></li>
                  <li></li>
                  <li></li>
              </ul>
          </div>
      </body>
============================

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM