1. 程式人生 > >Dom節點操作總結

Dom節點操作總結

Dom  

一:Dom的概念
  Dom的簡介:  全稱為 document object model  文件物件模型,是操作文件的一整套方法 - 文件 - html,document時一個物件,是dom的頂級物件,屬於window的一個物件,並且可以說是最出色的。

  Dom節點:組成整個html流程的所有步驟,相當於是所有標籤,文字,屬性,註釋構成了整個網頁 - 將構成網頁的每一個部分內容都看作是一個節點,整個網頁是由很多節點組成的。節點主要是:(標籤,文字,屬性,註釋)  /  元素節點(標籤)   ,因為在實際的操作過程中,元素節點是比較重要的,所以在獲取或者建立節點的時候,一般都是在操作元素節點,像註釋節點,文字節點相對來說就用的比較少。

  Dom樹:簡單來說,Dom樹就是由許多的節點構成的,在以根節點HTML的基礎上,其餘節點為子節點,組成一個樹的資料結構就是為Dom樹。

  

  dom樹的表示。

      

二:Dom節點操作        那麼我們為什麼要獲取節點呢?節點能做什麼?     1、找到元素     2、設定元素屬性值     3、設定元素的樣式     4、建立/刪除元素     5、事件的觸發        等等等等。。。。     所以節點的作用是非常給力的。涉及的知識較多,我就簡單總結下節點的所有的基本操作。   1:獲取元素的方法     
 1      console.log(document)  // document
 2         console.log(document.documentElement) // 獲取html標籤
 3         console.log(document.body)  // 獲取body標籤
 4         console.log(document.head)  // 獲取head 標籤
 5         console.log(document.title) // 獲取title 標籤
 6 
 7         // 獲取有 id 的標籤的dom方法時,必須使用 document 呼叫 getElementById
 8         console.log(document.getElementById('id'))  // 通過id
 9 
10         //getElementsByTagName這個方法除了可以使用document以外,還可以使用元素呼叫
11         console.log(document.getElementsByTagName('div'))     // 通過標籤名
12 
13         console.log(document.getElementsByClassName('.box'))  // 通過class名獲取
14         console.log(document.getElementsByName('name'))       // 通過name名來獲取
15         console.log(document.querySelector('.box'))           // 通過css選擇器來獲取
16         console.log(document.querySelectorAll('div'))         // 通過css選擇器來獲取 所有的標籤
17 
18         // 總結 : 通過 id  和 name 獲取標籤只能使用 document 呼叫,通過標籤名,class名,css選擇器都可以通過父元素來呼叫方法,獲取子元素的標籤

  

     2:節點的型別 nodeType & 節點名 nodeName & 節點值 nodeValue           要想獲取節點的型別,名稱,值需要先獲取對應的節點。以下是我書寫的html標籤。     節點主要有 文字節點,註釋節點,元素節點
1   <div id="ids">
2         <!-- dom 是 文件物件模型 -->
3         <div class="box">文字</div>
4         <p>文字</p>
5         <div class="box" name="1"></div>
6         文字 屬性
7     </div>
 1         var ids = document.getElementById('ids') 
 2         var nodes = ids.childNodes // 獲取 ids 下的所有子節點
 3         console.log(nodes)    // nodes是ids下所有子節點的集合列表  
 4         console.log(nodes[0].nodeType)  // 文字節點型別  3
 5         console.log(nodes[0].nodeName)  // 文字節點名  #text
 6         console.log(nodes[0].nodeValue) // 文字節點值  就是文字內容,空格也是文字節點
 7 
 8         console.log(nodes[1].nodeType)  // 註釋節點型別  8
 9         console.log(nodes[1].nodeName)  // 註釋節點名  #comment
10         console.log(nodes[1].nodeValue) // 註釋節點值  就是註釋內容
11 
12         console.log(nodes[3].nodeType)  // 元素節點型別  1
13         console.log(nodes[3].nodeName)  // 元素節點名  大寫的標籤名
14         console.log(nodes[3].nodeValue) // 元素節點值  null

 

  3:節點的操作 

    還是一樣,配合我書寫的 div 標籤為 ID名為 ids 的來演示節點的操作方法

 1         var ids = document.querySelector('#ids') // 獲取父元素
 2 
 3         console.log(ids.childNodes) // 獲取 ids 下的所有子節點
 4         console.log(ids.children)  // 獲取 ids 下的所有子元素節點
 5         
 6         console.log(ids.firstChild)  // 獲取 ids 下的第一個子節點
 7         console.log(ids.firstElementChild) // 獲取 ids 下的第一個子元素節點
 8         
 9         console.log(ids.lastChild) // 獲取 ids 下的最後一個子節點
10         console.log(ids.lastElementChild) // 獲取 ids 下的最後一個子元素節點
11 
12         console.log(ids.nextSibling)  // 下一個兄弟節點
13         console.log(ids.nextElementSibling)  //   下一個兄弟元素節點
14 
15         console.log(ids.previousSibling)  // 獲取上一個兄弟節點
16         console.log(ids.previousElementSibling)  // 獲取上一個兄弟元素節點 // 不只是相同的標籤,不同的也可以
17 
18         console.log(ids.parentNode)  // 獲取父節點
19         console.log(ids.parentElement)  // 獲取父元素節點

 

    4:節點的增刪改查操作(重要)          節點操作 - 增          1:建立元素節點:document.createElement(字串的標籤名)          2:建立文字節點: document.createTextNode("文字")  相當於建立了一個檔案節點物件,直接可以將這個文字節點物件插入在任何需要的位置          3:追加:父容器.appendChild(子元素);  將子元素插入在父容器的尾部          4:給標籤新增文字: 父容器.textContent = '你要新增的內容'          5:插入標籤:父容器.insertBefore(要插入的元素,插入在誰的前面)          6:複製元素:元素.cloneNode(深度布林值) 要用新的變數接收             6.1:cloneNode(深度布林值)                   1:深度布林值==false  淺複製   僅複製元素,不復制內容和子元素                 2:深度布林值==true  深複製  可以將元素和元素裡面的內容及子元素都複製進去
 1        var div = document.createElement('div')  // 建立 標籤
 2         document.body.appendChild(div)    // 將div元素放在body標籤的尾部
 3 
 4         // 追加:父容器.appendChild(子元素);  將子元素插入在父容器的尾部
 5         var span = document.createElement('span')
 6         div1.appendChild(span)  // 將 span 標籤放在 div 標籤中
 7         span.textContent = '你好'
 8 
 9         // 插入標籤  在 div 中,插入一個 b 標籤到 span 便籤前
10         var b = document.createElement('b')
11         // 插入書寫方式一:
12         div.insertBefore(b,span)
13         // 插入書寫方式二:
14         div.insertBefore(b,div.lastElementChild)
15 
16         // 建立文字節點:document.createTextNode("文字") 
17         // 放在 div 的 b 標籤中
18         var text = document.createTextNode('我是建立好的文字節點')
19         // 將建立好的文字節點插入在 div 中 第一個元素節點前
20         div.insertBefore(text,div.firstElementChild)
21         console.log(div)
22 
23         // 複製元素 元素.cloneNode(深度布林值)
24         var b1 = b.cloneNode(false)   // 淺複製
25         var b2 = b.cloneNode(true)    // 深複製
26         console.log(b1,b2)    

  節點操作 - 刪

   // 1: 元素.remove();   元素自身刪除         // 2: 頁面標籤.remove();   // 指從DOM樹上刪除         // 3:父容器.removeChild(子元素); 父容器刪除子元素           // 4:快速清除所有子元素: 元素.innerHTML = " "  
        var b = document.createElement('b')
        document.body.appendChild(b)
        // 複製元素
        var b1 = b.cloneNode(false)
        var b2 = b.cloneNode(false)
        
        b1.remove()  // 刪除 b1 元素

        var dl = document.createElement('dl')
        document.body.appendChild(dl)
        dl.appendChild(b2)
        dl.removeChild(b2)   // 刪除再 dl 中 的 b2 元素
        // 注意這樣是 無法刪除乾淨  需要 b2 = null
        document.body.appendChild(b2)   // 這行程式碼證明 b2 沒有刪除乾淨,快取還在
        b2 = null   // 當 b2 被賦值為 null 時 b2 就是完全刪除乾淨,無法再呼叫
        // document.body.appendChild(b2)  // 在這裡 b2 無法被呼叫 ,並且報錯  

  

  節點操作 - 改         1:父容器.replaceChild(新的元素,要替換的元素)
1         var input = document.createElement('input')  // 建立input標籤
2         var div = document.createElement('div')      // 建立div標籤
3         document.body.appendChild(div)      // 將div元素插入在body的尾部
4         document.body.replaceChild(input,div)   // 替換元素

 

  

  5:DOM元素(標籤)屬性的操作          DOM元素概念          任何一個DOM元素,有兩種屬性,一個是物件屬性,一個是標籤屬性               1:把寫在標籤上的屬性稱為標籤屬性               2:任何一個DOM元素都是物件模型,都可以自主的新增設定物件的屬性和值
        DOM 元素屬性的操作 - 增刪改查          1:元素的屬性  -  增 - 元素.setAttribute(屬性名,屬性值)          1.1:單屬性的新增方式:如表單的 checked 屬性 ,設定時:屬性名('checked','checked') 或者('checked','')          注意:屬性名的命名不能使用駝峰式命名,通常命名時使用-區分兩個單詞:toggle-target , 屬性值不能出現大寫,並且必須是字串
 1         var div0 = document.createElement('div')
 2         document.body.appendChild(div0)
 3         div0.setAttribute('渣渣輝','一刀999')  // 給元素新增屬性
 4         div0.setAttribute('class','999')  // 屬性2
 5 
 6         // 2:元素的屬性 - 刪 - 元素.removeAttribute(屬性名)
 7         div0.removeAttribute('渣渣輝')  // 刪除屬性 渣渣輝
 8 
 9         // 3:元素的屬性 - 改 - 改其實就是增加屬性的操作,當屬性不存在,就是增,當屬性存在,再就是再原基礎上修改他
10         div0.setAttribute('class','666666')
11 
12         // 4:元素的屬性 - 獲取(檢視)屬性值 - 元素.getAttribute(屬性名)
13         console.log(div0.getAttribute('class'))
14 
15         // 擴充知識1 :DOM元素都是物件模型,物件屬性並不會顯示在標籤上(如:a 標籤的 href 屬性,img 的 src 屬性)
16         // 擴1案例 :1: img.src = '你要放入的圖片地址'  2: a.href = '你要放入的圖片地址' 3: div.a = 10 - 給 div 新增屬性,名為 a 值為 10
17         // 擴2:DOM元素都是object,所以設定屬性都是按照物件屬性來設定,當遇到標籤屬性值和物件屬性值衝突時,以物件屬性值為準
18         // 擴2案例:
19         var ck=document.querySelector("input")
20         ck.setAttribute("checked","")  // input 新增屬性 checked ,input設定checked時,就是為true == 選中
21         ck.checked=false  // 當標籤屬性值和物件屬性值衝突時,以物件屬性值為準,此時checked 就是為 false == 不選中

 

   6:元素節點樣式的操作             
 1         // 1:標籤樣式 - 增
 2         // 方法1: 通過增加屬性的方法增加 行內 (注意行內)樣式 元素.setAttribute(屬性名,屬性值)
 3         var div0 = document.createElement('div')
 4         document.body.appendChild(div0)
 5         div0.setAttribute("style","width:50px;height:50px;background-color:red")
 6         // 方法2: - 元素.style.你要新增的樣式名 = '樣式值'
 7         div0.style.margin = '5px'
 8 
 9         // 2:標籤樣式獲取 
10         console.log(div0.style.width)  // 只能獲取到 行內樣式 ,無法獲取到內部和外部的樣式
11         // 萬能獲取法:getComputedStyle(元素)   不管是 行內,內部,外部的樣式都能獲取
12         console.log( getComputedStyle(div0).width)
13 
14         // 3 :獲取元素的矩形邊界限範圍 (IE8以後才有的方法)
15         // 語法:元素..getBoundingClientRect()   
16         // IE 相容方法:元素.currentStyle.樣式屬性
17         var res = div0.getBoundingClientRect()
18         console.log(res)
19         // 此方法也是物件模型,屬性共有 八個,分別為以下屬性
20         /*{
21             width,  // offsetWidth
22             height, // offsetHeight
23             left,   // 最左邊到可視視窗的距離
24             top,    // 最頂部到可視視窗的距離
25             right,  // left+width 最右邊到可視視窗的距離
26             bottom, // top+height  最下面到可視視窗的距離
27             x,      // left  座標X軸
28             y       // top   座標Y軸
29         }
30         */