Javascript | DOM\DOM樹淺析


DOM


 

Document Object Model(文檔對象模型)

定義了表示和修改文檔所需的方法。

DOM對象即為宿主對象,由瀏覽器廠商定義,用來操作html和xml功能的一類對象的集合。也有人稱DOM是對html以及xml的標准編程接口

是一種與瀏覽器、平台、語言的接口,使用該接口可以輕松的訪問頁面中所有的標准組件。

DOM又分為三部分:DOM CORE(核心)、HTML-DOM、 CSS-DOM 

HTML-DOM可以理解為API.他將網頁中的各個元素都看作一個對象,從而是網頁中的元素也可以被計算機語言獲取或編輯。

例如:element.src

CSS-DOM是針對CSS的操作,主要作用是獲取和設置style對象的各種屬性

例如:element.style.color = “red”

在了解DOM前我們還要知道一個小知識哦---節點

在HTML-DOM中HTML文檔中所有內容都被視為節點,DOM被視為節點樹的HTML

1)   整個文檔為一個文檔節點

2)   每一個HTML元素為元素節點

3)   HTML元素中的文本視為文本節點

4)   每個HTML屬性為屬性節點

5)   注釋為注釋節點

節點類型

  元素節點  1      以下數值表示節點屬性-nodeType ,返回的數值

  屬性節點  2

  文本節點  3

  注釋節點  8

  document  9

  DocumentFragment 11  

 

節點的四個屬性

nodeName  元素的標簽名,可讀不可寫

nodeValue  元素值,可讀可寫,文本text和注釋節點comment有此屬性,我們可以想象要查看屬性的值,可以忽略理解為內容,文本和注釋節點有鐵打的內容,而其他的節點只是光禿禿的Name

 nodeType   節點類型,返回節點類型后的數值

 attributes  屬性節點的集合 

 

節點的方法

Nodes.hasChildNodes()     有沒有子節點   返回false\ture


 

對節點的增刪改查

    

  • 方法類

     查看元素節點     document代表整個文檔

     document.getElementById()     通過ID獲取元素節點id在ie8以下的瀏覽器,不區分id的大小寫

     document.getElementByTagName      通過標簽名獲取元素節點

     document.getElemntByName       通過name獲取元素節點只有部分標簽name可生效  (表單,img,iframe)

    document .getElementClassName      通過類名獲取元素節點  在ie7和ie8里沒有

     .querySelector      (‘div > span’)   css選擇器在ie7和ie7一下的版本中沒有

     .querySelectorAll          css選擇器在ie7和ie7一下的版本中沒有  

         注:query這兩個方法不及時更新,比如 第一版div下有一個span,用query獲取后在更改,再次獲取結果仍然是div>span。而其余四個都具有實時性。

  • 關系類 ( 節點類型)

節點和元素節點有什么區別呢???

節點就是上面的6類,元素節點呢當然就是HTML元素啦,小笨蛋!所以基於元素節點的遍歷出來的就是htm中的各類元素節點啦!

遍歷節點數(兼容性好)

     parentNode   父節點    一直獲取,最頂端parentNode是 #document

     childNodes   子節點   包括文本注釋等節點

     firstChild   第一個節點

     lastChild   最后一個節點

     nextSibling  下一個兄弟節點 

     previousSibling   上一個兄弟節點 

 

基於元素節點數的遍歷   

   parentElement  父元素節點

   childen   子元素節點   除此以外ie9都不兼容,常用

   node.childElementCount     == childent.length

   firstElementChild

   lastElementChild

   nextElemntChild

   previousElementSibling

 

NOW想想自己是一個大牛 調出元素的所有子節點了

//調出元素的所有子元素節點
       var div = document.getElementsByTagName('body')[0];
       function renElementChild(node){
       var temp = {    //類數組
           length : 0,
           push : Array.prototype.push,
           splice : Array.prototype.splice,
       }
       child = node.childNodes,
       len = child.length;
        for(var i = 0 ; i < len; i++){
            if(child[i].nodeType ===1){
             temp.push(child[i]);
            }
        }
        return temp;
       }

 真厲害,你棒你棒,你認真最棒!

dom基本操作

1.getElementbyId方法定義在Document.prototype上,即Element節點上不可以使用

2.getElementsByName方法定義在HTMLDocument.prototype上,即非htmldocument不能使用(xml document,Element)

3.getElementByTagName方法定義在Document.prototype和Element.prototype上

4.HTMLDocument.prototype定義了一些常用的屬性,bodu,head分別指文檔中的<body><head>標簽

5.document.prototype上定義了ducomentElement屬性,指代文檔的根元素,在HTML文檔中指代<html>元素

6.getElementsByClassName、querySelectorALL、querySelector在Document.prototype、Element.prototype類中均有定義

document.createElement   //創建元素節點

document.creatTextNode   //創建文本節點

document.creatComment    //創建注釋節點

document.craetDocumentFragment  //創建碎片節點

PARENTNODE.appendChild     類似於剪切

PARENTNODE.insertBefore(a,b)    a插入到b

parent.removeChild()    父節點剪切出子節點

child.remove ()         子節點自己銷毀

替換

parentNode.replaceChild(new,origin)    用new替換origin

Element上的屬性

  innerHTML    

  innerText (火狐不兼容)/textContent(老版本IE不好使)

Element節點上的一些方法

  ele.setAttribute(‘class’,’demo’)

  ele.getAttribute(‘id’)

 

//封裝函數,返回元素e的第n層祖先元素節點
    function retParent(elem,n){
       while(elem && n){
            elem = elem.parentElement;
            n--;
       }
     return elem;
    }
var i = document.getElementsByTagName('i')[0]; //封裝函數,返回元素e的第n個兄弟元素節點,n為正返回元素后面的兄弟元素,n為負返回前面的兄弟元素,n為0返回自己 function retSibling(e,n){ while(e && n){ if(n > 0){ if(e.nextElementSibling){ e = e.nextElementSibling; }else{ for(e = e.nextElementSibling ; e && e.nodeType != 1 ; e = e.nextElementSibling); } n--; } else { if(e.previousElementSibling){ e = e.previousElementSibling; }else{ for(e = e.previousElementSibling ; e && e.nodeType != 1 ; e = e.previousElementSibling); } n++; } } return e; } //編輯函數,解決myChildren功能,解決以前部分瀏覽器的兼容性問題 Element.prototype.myChild = function(){ var child = this.childNodes; var len = child.length; var arr = []; for(var i = 0 ;i < len; i++){ if(child[i].nodeType === 1){ arr.push(child[i]); } } return arr; } var div = document.getElementsByTagName('div')[0]; //封裝hasChildren(),不可以用children屬性 Element.prototype.myChild = function(){ var child = this.childNodes; var len = child.length; var arr = []; for(var i = 0 ;i < len; i++){ if(child[i].nodeType === 1){ return ture } } return false; } var div = document.getElementsByTagName('div')[0];

 


免責聲明!

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



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