[ JavaScript ] 敲完這幾行代碼,DOM基本操作也就學會了!


帶着例子學Dom 幾行代碼就搞定!

DOM查找

document代表整個文檔

按id屬性,精確查找一個元素對象
document.getElementById() //(唯一標識)元素id 在Ie8以下的瀏覽器,不區分id大小寫,而且也返回匹配name屬性的元素

按標籤名查找 返回一個動態集合
document.getElementsByTagName() // 標籤名

通過name屬性查找 返回一個動態集合
document.getElementByName(); //,需注意,只有部分標籤name可生效(表單,表單元素,img,iframe)

通過class查找 返回一個動態集合
document.getElementsByClassName() // 類名 -> ie8和ie8以下的ie版本中沒有,可以多個class一起

通過CSS選擇器查找 返回一個動態集合
document.querySelector() // css選擇器 在ie7和ie7以下的版本中沒有(缺點不能實時更新)

通過CSS選擇器查找 返回一個動態集合
document.querySelectorAll() // css選擇器 在ie7和ie7以下的版本中沒有(缺點不能實時更新)

節點的類型 nodeType

元素節點 —— 1
屬性節點 —— 2
文本節點 —— 3
註釋節點 —— 8
document —— 9
DocumentFragment —— 11
獲取節點類型 nodeType
在這裏插入圖片描述
(更正:圖示屬性節點 更正爲 元素節點 nodeType 值爲 1)

遍歷節點樹

parentNode -> 父節點 (最頂端的parentNode爲#document);

childNodes -> 子節點們

firstChild -> 第一個子節點

lastChild -> 最後一個子節點

nextSibling->後一個兄弟元素

previousSibling->前一個兄弟元素

加深理解 習題1——編輯函數,封裝children功能,解決以前部分瀏覽器的兼容性問題

//獲取div元素 獲取span元素
var div = document.getElementsByTagName('div')[0];
var span = document.getElementsByTagName('span')[0];
//在原型鏈上定義myChildren函數
Element.prototype.myChildren = function(){
//將當前元素節點的直接子節點賦值給child
      var child = this.childNodes;
      //獲取直接子節點的個數
      var len = child.length;
      //定義空數組
      var arr = [];
      //遍歷子節點
      for(var i = 0;i < len;i++){
      //若子節點nodeType值爲 1 即爲元素節點
      		if(child[i].nodeType == 1){
      		//將該元素節點放在arr數組內
             		arr.push(child[i]);
               }
      }
      //返回 當前元素節點的所有直接子元素節點
        return arr;
 }

基於元素節點樹的遍歷

parentElement -> 返回當前元素的父元素節點 (IE9及以下不兼容)

children -> 只返回當前元素的元素子節點

node.childElementCount === node.children.length當前元素節點的子元素節點個數(IE9及以下不兼容)

firstElementChild -> 返回的是第一個元素節點(IE9及以下不兼容)

lastElementChild -> 返回的是最後一個元素節點(IE9及以下不兼容)

nextElementSibling / previousElementSibling ->返回後一個/前一個兄弟元素節點(IE9及以下不兼容)

節點的四個屬性

nodeName 元素的標籤名,以大寫形式表示,只讀

nodeValue Text節點或Comment節點的文本內容,可讀寫

nodeType 該節點的類型,只讀

attributes Element 節點的屬性集合

Node.hasChildNodes判斷是否包含指定屬性

document.getElementById('bt1').hasAttribute('onclick');

DOM繼承樹

在這裏插入圖片描述
(document --> HTMLDocument.protptype --> Document.prototype)

DOM樹 加深理解

<script>
	HTMLBodyElement.prototype.abc='demo';
    var body = document.getElementsByTagName('body')[0];
    var head = document.getElementsByTagName('head')[0];
    //根據繼承樹 head 不屬於HTMLBodyElement
</script>

在這裏插入圖片描述

<script>
	HTMLElement.prototype.abc='demo';
    var body = document.getElementsByTagName('body')[0];
    var head = document.getElementsByTagName('head')[0];
    //根據繼承樹 head body 屬於HTMLElement
</script>

在這裏插入圖片描述
1.getElementById方法定義在Document.prototype上,即Element節點上不能使用。

2.getElementsByName方法定義在HTMLDocument.prototype上,即非html中的document以外不能使用(如xml document,Element)

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

<script>
        var div = document.getElementsByTagName('div')[0];
        //div 下面的 span 元素 
        var span = div.getElementsByTagName('span')[0];
</script>

4.HTMLDocument.prototype定義了一些常用的屬性,body,head,分別指代HTML文檔中的標籤。
在這裏插入圖片描述
5.Document.prototype上定義了documentElement屬性,指代文檔的根元素,在HTML文檔中,他總是指代元素(document.documentElement --> html)
在這裏插入圖片描述
6.getElementsByClassName、querySelectorAll、querySelector在Document,Element類中均有定義

加深理解 習題2——封裝函數,返回元素e的第n層祖先元素

<body>
<div>
        <p></p>
        <span>
            <strong></strong>
            <i></i>
        </span>
    </div>
 <script>
        function retParent(elem,n){
            while(elem && n){
                elem = elem.parentElement;
                n--;
            }
            return elem;
        }
        var i = document.getElementsByTagName('i')[0];
</script>
</body>

在這裏插入圖片描述
加深理解 習題3——編輯函數,封裝children功能,解決以前部分瀏覽器的兼容性問題

<body>
    <div>
        <p></p>
        <span>
            <strong></strong>
            <i></i>
        </span>
    </div>
    <script>
        var div = document.getElementsByTagName('div')[0];
        Element.prototype.myChildren = function(){
            var child = this.childNodes;
            var len = child.length;
            var arr = [];
            for(var i = 0;i < len;i++){
            //nodeType == 1爲元素節點
                if(child[i].nodeType == 1){
                    arr.push(child[i]);
                }
            }
            return arr;
        }
    </script>
</body>

在這裏插入圖片描述

DOM修改

在這裏插入圖片描述

修改屬性

1.Element節點的一些屬性
innerHTML
innerText(火狐不兼容) / textContent(老版本IE不好使)

2. Element節點的一些方法
ele.setAttribute()//設置屬性值
ele.getAttribute();//獲取屬性值
ele.removeAttribute();//移除屬性

//設置div class屬性 屬性值爲content
var div = document.getElementsByTagName(“div")[0]; 
div.setAttributeNode(class”,"content");
//獲取div標籤 class的屬性值
div.getAttributeNode(class);
//刪除div標籤 class 屬性
div.removeAttribute('class');

加深理解 爲所有元素加上class屬性,屬性名爲對應標籤名

var all = document.getElementsByTagName('*');
for(var i = 0;i < all.length;i++){
    all[i].setAttribute('this-name',all[i].nodeName);
}

加深理解 習題4——請編寫一段JavaScript腳本生成下面這段DOM結構。要求:使用標準的DOM方法或屬性。提示 dom.className 可以讀寫class。

 <div class="example">
    <p class="slogan">alalasheep@163.com</p>
 </div>

代碼實現

         //創建 div 元素節點
         var div = document.createElement('div');
         //創建 p 元素節點
         var p = document.createElement('p');
         //創建 文本節點
         var text = document.createTextNode('[email protected]');
         //爲新創建的div標籤設置屬性名爲class 值爲 example
         div.setAttribute('class','example');
         //爲新創建的p標籤設置屬性名爲class 值爲 slogan
         p.setAttribute('class','slogan');
         //將 p 標籤添加到 div標籤內
         div.appendChild(p);
         //將文本節點 添加到p標籤內
         p.appendChild(text);
         //將整個 div 掛在 Dom樹上
         document.body.appendChild(div);

修改樣式

內聯樣式: elem.style.屬性名
強調: 屬性名: 去橫線,變駝峯
比如:
css: background-color => backgroundColor
list-style-type => listStyleType

var span = document.getElementsByTagName("span")[0];
var div = document.getElementsByTagName("div")[0];
//修改單個樣式
span.style.color = "red";
//駝峯式命名
span.style.backgroundColor = "#096";
//修改樣式集合
div.style.cssText="width:200px;height:200px;background-color:red;";

DOM添加

  1. 創建空元素
    document.createElement();//創建元素節點
    document.createTextNode();//創建文本節點
    document.createComment();//創建註釋節點
    document.createDocumentFragment();//創建文檔碎片

  2. 添加元素的步驟

  • 設置關鍵屬性
a.innerHTML="go to tmooc" 
a.herf="http://tmooc.cn";

<a href="http://tmooc.cn">go to tmooc</a>
  • 設置關鍵樣式
a.style.opacity = "1";
a.style.cssText = "width: 100px;height: 100px";
  1. 將元素添加到將元素添加到DOM樹
    PARENTNODE.appendChild();//添加子節點
var div = document.createElement( 'div' );
var txt = document.createTextNode('alalasheep');
div.appendChild(txt); 
//標籤元素 最終要掛在body上
document.body.appendChild(div);

PARENTNODE.insertBefore(a, b);//在a節點前添加b節點

var ul = document.getElementById('menu'); 
var newLi = document.createElement('li');
//在父元素中的最後一個子節點之前添加一個新的子節點
ul.insertBefore(newLi, ul.lastChild);

加深理解 習題5——封裝函數insertAfter();功能類似insertBefore();

//在原型鏈上封裝 將 targetNode 插在 afterNode 之後
 Element.prototype.insertAfter = function(targetNode,afterNode){
 			//將afterNode的下一個兄弟節點賦值給beforeNode
            var beforeNode = afterNode.nextElementSibling;
            //如果afterNode沒有下一個兄弟節點就在當前節點下面添加子節點targetNode
            if(beforeNode == null){
                this.appendChild(targetNode);
            }
            //否則在在下一個兄弟節點之前插入targetNode
            else{
                this.insertBefore(targetNode,beforeNode);
            }
        }
        var div = document.getElementsByTagName('div')[0];
        var p = document.getElementsByTagName('p')[0];
        var span = document.createElement('span');
        var text = document.createTextNode('lalasheep');
        span.appendChild(text);
        div.insertAfter(span,p);
  1. 刪除子節點
    parent.removeChild();//刪除子節點
 var div = document.getElementsByTagName('div')[0];
 var span = document.getElementsByTagName('span')[0];
  //刪除div標籤下的span標籤
 div.removeChild(span);
  1. 替換節點(不常用)
    parent.replaceChild(new, origin);

添加元素優化

文檔片段: 內存中,臨時保存多個平級子元素的 虛擬父元素 用法和普通父元素完全一樣
如何:
1.創建片段

var frag=document.createDocumentFragment();

2.將子元素臨時追加到frag中

 frag.appendChild(child);

3.將frag追加到頁面

parent.appendChild(frag);

強調: append之後,frag自動釋放,不會佔用元素

熬夜用心總結,有用記得點贊+收藏+評論
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章