DOM操做

1基本介紹

文檔對象模型 (DOM) 是HTML和XML文檔的編程接口。它給文檔(結構樹)提供了一個結構化的表述而且定義了一種方式—程序能夠對結構樹進行訪問,以改變文檔的結構,樣式和內容。
DOM 提供了一種表述形式將文檔做爲一個結構化的節點組以及包含屬性和方法的對象。從本質上說,它將web 頁面和腳本或編程語言鏈接起來了。css

從以上論述,咱們大概知道:web

  • 文檔對象模型是HTML和XML文檔的編程接口(將web頁面和腳本鏈接了起來);編程

  • 提供了一種表述形式將文檔做爲一個結構化的節點組以及包含屬性和方法的對象;數組

爲測試方便,先構建一個結構樹瀏覽器

結構樹

document對象

每一個載入瀏覽器的HTML文檔都會成爲document對象。document對象包含了文檔的基本信息,咱們能夠經過JavaScript對HTML頁面中的全部元素進行訪問、修改。cookie

document對象具備一些經常使用的屬性:app

  • doctype屬性

    在書寫HTML文檔的時候第一句通常都是doctype聲明,能夠經過document對象獲取,沒有則返回null;dom

  • head、body屬性

    經過訪問documen的head屬性或者body屬性來得到文檔樹的head節點,以及body節點,這兩個節點都是包括該元素的字節點的;編程語言

  • activeElement屬性

    activeElement屬性返回當前文檔中得到焦點的那個元素。性能

用戶一般可使用tab鍵移動焦點,使用空格鍵激活焦點,好比若是焦點在一個連接上,此時按一下空格鍵,就會跳轉到該連接

  • documentURI、domain、lastModified三個屬性

    1.documentURI屬性返回當前文檔的網址

2.domain屬性返回文檔域名

3.lastModified返回當前文檔的最後修改時間

  • location屬性

    location屬性返回一個只讀對象,提供了當前文檔的URL信息

  • title、characterSet屬性

    • title屬性返回當前文檔的標題,該屬性是可寫的

    • characterSet屬性返回渲染當前文檔的字符集

  • readyState

    readyState屬性返回當前文檔的狀態,共有三種可能的值

    • loading:加載HTML代碼階段,還沒有完成解析

    • interactive:加載外部資源階段

    • complete:所有加載完成

  • compatMode

    compatMode屬性返回瀏覽器處理文檔的模式,可能的值爲

    • BackCompat:向後兼容模式,也就是沒有添加DOCTYPE

    • CSS1Compat:嚴格模式,添加了DOCTYPE

  • cookie

    cookie是存儲在客戶端的文本;

  • innerText

    innerText是一個可寫屬性,返回元素內包含的文本內容,在多層次的時候會按照元素由淺到深的順序拼接其內容;

以以前構建的文檔樹爲例,,返回了id爲purchase元素節點下的文本內容.

  • innerHTML、outerHTML屬性

    innerHTML屬性做用和innerText相似,可是不是返回元素的文本內容,而是返回元素的HTML結構,在寫入的時候也會自動構建DOM;

outerHTML 返回內容還包括自己;

待補充.......................

2Element對象

除了document對象,在DOM中最經常使用的就是Element對象了,Element對象表示HTML元素。
DOM提供了一系列的方法能夠進行元素的增、刪、改、查操做;

  • 查詢元素

    • getElementById()
      getElementById方法返回匹配指定ID屬性的元素節點。若是沒有發現匹配的節點,則返回null。這也是獲取一個元素最快的方法

    • getElementsByClassName()
      getElementsByClassName方法返回一個相似數組的對象(HTMLCollection類型的對象),包括了全部class名字符合指定條件的元素(搜索範圍包括自己),元素的變化實時反映在返回結果中。這個方法不只能夠在document對象上調用,也能夠在任何元素節點上調用。

getElementsByClassName方法的參數,能夠是多個空格分隔的class名字,返回同時具備這些節點的元素。

  • getElementsByTagName()
    getElementsByTagName方法返回全部指定標籤的元素(搜索範圍包括自己)。返回值是一個HTMLCollection對象,也就是說,搜索結果是一個動態集合,任何元素的變化都會實時反映在返回的集合中。這個方法不只能夠在document對象上調用,也能夠在任何元素節點上調用。

    • getElementsByName()
      getElementsByName方法用於選擇擁有name屬性的HTML元素,好比form、img、frame、embed和object,返回一個NodeList格式的對象,不會實時反映元素的變化。

如下兩種方法要考慮兼容性的問題

  • querySelector()
    querySelector方法返回匹配指定的CSS選擇器的元素節點。若是有多個節點知足匹配條件,則返回第一個匹配的節點。若是沒有發現匹配的節點,則返回null。

querySelector方法沒法選中CSS僞元素。

    • querySelectorAll()
      querySelectorAll方法返回匹配指定的CSS選擇器的全部節點,返回的是NodeList類型的對象。NodeList對象不是動態集合,因此元素節點的變化沒法實時反映在返回結果中。

    • 建立元素

    • createElement()
      createElement方法用來生成HTML元素節點。

    createElement方法的參數爲元素的標籤名,即元素節點的tagName屬性。若是傳入大寫的標籤名,會被轉爲小寫。若是參數帶有尖括號(即<和>)或者是null,會報錯。

    • createTextNode()
      createTextNode方法用來生成文本節點,參數爲所要生成的文本節點的內容。

    • createDocumentFragment()
      createDocumentFragment方法生成一個DocumentFragment對象。

    DocumentFragment對象是一個存在於內存的DOM片斷,可是不屬於當前文檔,經常用來生成較複雜的DOM結構,而後插入當前文檔。這樣作的好處在於,由於DocumentFragment不屬於當前文檔,對它的任何改動,都不會引起網頁的從新渲染,比直接修改當前文檔的DOM有更好的性能表現。

    • 修改元素

    • appendChild()
      在元素末尾添加元素

    • insertBefore()
      在某個元素以前插入元素

    • replaceChild()
      replaceChild()接受兩個參數:要插入的元素和要替換的元素

    • 刪除元素

      刪除元素使用removeChild()方法便可

    clone元素
    cloneNode()方法用於克隆元素,方法有一個布爾值參數,傳入true的時候會深複製,也就是會複製元素及其子元素(IE還會複製其事件),false的時候只複製元素自己

    • 屬性操做

    • getAttribute()
      getAttribute()用於獲取元素的attribute值

    • createAttribute()
      createAttribute()方法生成一個新的屬性對象節點,並返回它。

    createAttribute方法的參數name,是屬性的名稱。

    • setAttribute()
      setAttribute()方法用於設置元素屬性

    • romoveAttribute()
      removeAttribute()用於刪除元素屬性

    • element.attributes
      固然上面的方法作的事情也能夠經過類操做數組屬性element.attributes來實現

    複習部分

    • 題目1: dom對象的innerText和innerHTML有什麼區別?

      dom對象的innerText和innerHTML屬性一個是輸出元素節點的文本,一個是輸出該節點下的HTML結構,差別能夠經過如下實例驗證:

    • 題目2: elem.children和elem.childNodes的區別?

      elem.children 和elem.childNodes區別在於:

    • elem.children主要返回的是當前元素節點的全部子元素節點;

    • elem.childNodes主要返回的是當前元素節點的全部子節點(包括元素節點,屬性節點以及文本節點);

    • 題目3:查詢元素有幾種常見的方法?ES5的元素選擇方法是什麼?

      查詢元素有3種常見的方法

    • element.getElementById()方法
      返回匹配指定的ID屬性的元素節點;

    • element.getElementsByClassName()方法
      返回HTML collection類型的對象,該對象形式相似於數組,包括了全部class名字符合匹配條件的元素(搜索範圍包括自己),該方法不只能夠在document對象上使用,也能夠在任意的元素節點上使用;

    • element.getElementsByTagName()方法
      返回全部指定標籤的元素(搜索範圍包括自己),返回值爲HTML Collection 對象,該方法不只在document對象中調用,並且能夠在任意的元素節點上調用;

    • element.getElementsByName()方法
      該方法用於選擇具備name屬性的HTML元素,返回一個NodeLIst格式的對象,不會實時反映元素的變化;

    ES5的元素選擇方法爲:

    • querySelectot()
      該方法返回匹配指定的css選擇器的元素節點,若是有多個元素節點知足條件,則返回匹配到的第一個元素節點;

    • querySelectorAll()
      該方法返回匹配指定的css選擇器的全部節點,返回的是NodeList類型的對象;

    • 題目4:如何建立一個元素?如何給元素設置屬性?如何刪除屬性

      建立元素: 經過createElement()方法來生成HTML元素節點;

    設置屬性: 經過setAttribute()方法用於設置元素屬性;
    刪除屬性: 經過removeAttribute()方法來刪除元素屬性;

    • 題目5:如何給頁面元素添加子元素?如何刪除頁面元素下的子元素?

      經過元素的appendChild()方法給元素添加子元素,添加到元素末尾。

    經過元素的removeChild()方法刪除元素的子元素。

    • 題目6: element.classList有哪些方法?如何判斷一個元素的 class 列表中是包含某個 class?如何添加一個class?如何刪除一個class?

      • add( String [, String] ) 添加指定的類值。若是這些類已經存在於元素的屬性中,那麼它們將被忽略。

      • remove( String [,String] ) 刪除指定的類值。

      • item ( Number )按集合中的索引返回class值。

      • toggle ( String [, force] ) 當只有一個參數時:切換 class value; 即若是類存在,則刪除它並返回false,若是不存在,則添加它並返回true。
        當存在第二個參數時:若是第二個參數的計算結果爲true,則添加指定的類值,若是計算結果爲false,則刪除它

      • contains( String ) 檢查元素的類屬性中是否存在指定的類值。

      • 使用contains方法判斷一個元素的class中是否包含某個class。add添加一個class,remove刪除一個class。

        <script>
          //添加class
          var elem = document.getElementById('purchases');
          elem.classList.add('title','name','test');
          console.log(elem.classList);
        
          //刪除class
          elem.classList.remove('name');
          console.log(elem.classList);
        
          //按索引返回類值
          var res = elem.classList.item(0);
          console.log(res);
        
          //toggle ( String [, force] ) 當存在第二個參數時:若是第二個參數的計算結果爲true,則添加指定的類值,若是計算結果爲false,則刪除它
          elem.classList.toggle('ccc',true);
          console.log(elem.classList);
        
          //用contain方法來檢查元素中是否有指定的類值
          var res = elem.classList.contains('ccc');
           console.log(res);
           </script>

    • 題目7: 如何選中以下代碼全部的li元素? 如何選中btn元素?

    <script>
      //選中全部的li元素
      var list = document.getElementsByTagName('li');
      console.log(list);
      var list = document.querySelectorAll('li');
      console.log(list);
    
      //選中btn元素
      var elem = document.getElementsByClassName('btn');
      console.log(elem);
      var elem = document.querySelectorAll('.btn');
      console.log(elem);
      </script>
    相關文章
    相關標籤/搜索