JS知識總結之DOM操作

楊耿直小兄弟發表於2019-04-10

文件物件模型DOM(Document Object Model)定義訪問和處理HTML文件的標準方法。DOM 將HTML文件呈現為帶有元素、屬性和文字的樹結構(節點樹)。

先來看看下面程式碼:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>DOM</title>
</head>
<body>
    <h2><a href="http://www.baidu.com">js DOM</a></h2>
    <p>對HTML元素進行操作,可新增、改變或移除CSS樣式等</p>
    <ul>
        <li>JS</li>
        <li>DOM</li>
        <li>CSS</li>
    </ul>
</body>
</html>複製程式碼

將HTML程式碼分解為DOM節點層次圖:

HTML文件可以說由節點構成的集合,DOM節點有:

1. 元素節點:  上圖中<html>、<body>、<p>等都是元素節點,即標籤。

2. 文字節點:  向使用者展示的內容,如<li>...</li>中的JavaScript、DOM、CSS等文字。

3. 屬性節點:  元素屬性,如<a>標籤的連結屬性href="http://www.baidu.com"。

節點屬性:

遍歷節點樹:

以上圖ul為例,它的父級節點body,它的子節點3個li,它的兄弟結點h2、P。

DOM操作:

節點屬性

在文件物件模型 (DOM) 中,每個節點都是一個物件。DOM 節點有三個重要的屬性 :

1. nodeName : 節點的名稱

2. nodeValue :節點的值

3. nodeType :節點的型別

一、nodeName 屬性: 節點的名稱,是隻讀的。

1. 元素節點的 nodeName 與標籤名相同
2. 屬性節點的 nodeName 是屬性的名稱
3. 文字節點的 nodeName 永遠是 #text
4. 文件節點的 nodeName 永遠是 #document

二、nodeValue 屬性:節點的值

1. 元素節點的 nodeValue 是 undefined 或 null
2. 文字節點的 nodeValue 是文字自身
3. 屬性節點的 nodeValue 是屬性的值

三、nodeType 屬性: 節點的型別,是隻讀的。以下常用的幾種結點型別:

元素型別 節點型別
元素 1
屬性 2
文字 3
註釋 8
文件 9

JS知識總結之DOM操作

一、獲取DOM---getElementById()方法

語法:

document.getElementById("id")複製程式碼

二、獲取DOM---getElementsByName()方法

返回帶有指定名稱的節點物件的集合。

語法:

document.getElementsByName("name")複製程式碼

與getElementById() 方法不同的是,通過元素的 name 屬性查詢元素,而不是通過 id 屬性。

注意:

1. 因為文件中的 name 屬性可能不唯一,所有 getElementsByName() 方法返回的是元素的陣列,而不是一個元素。

2. 和陣列類似也有length屬性,可以和訪問陣列一樣的方法來訪問,從0開始。

三、獲取DOM---getElementsByTagName()方法

返回帶有指定標籤名的節點物件的集合。返回元素的順序是它們在文件中的順序。

語法:

document.getElementsByTagName("Tagname")複製程式碼

說明:

1. Tagname是標籤的名稱,如p、a、img等標籤名。

2. 和陣列類似也有length屬性,可以和訪問陣列一樣的方法來訪問,所以從0開始。

四、獲取DOM---getElementsByClassName()方法

返回帶有指定class名的節點物件的集合。

語法:

document.getElementsByClassName("Tagname")複製程式碼

但不相容ie8及以下瀏覽器

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>document.getElementsByClassName在ie8及其以下的相容性問題</title>
</head>
<body>
<div id="info" class="longzhoufeng"></div>
<script type="text/javascript">
    //原生js方法document.getElementsByClassName在ie8及其以下的相容性問題
    function getClassNames(classStr, tagName) {
        if(document.getElementsByClassName) {
            return document.getElementsByClassName(classStr)
        } else {
            var nodes = document.getElementsByTagName(tagName), ret = [];
            for(i = 0; i < nodes.length; i++) {
                if(hasClass(nodes[i], classStr)) {
                    ret.push(nodes[i])
                }
            }
            return ret;
        }
    }

    function hasClass(tagStr, classStr) {
        var arr = tagStr.className.split(/\s+/); //這個正規表示式是因為class可以有多個,判斷是否包含
        for(var i = 0; i < arr.length; i++) {
            if(arr[i] == classStr) {
                return true;
            }
        }
        return false;
    }

    var aaa = getClassNames('longzhoufeng', 'div');
    alert(aaa[0].id)
    alert(aaa[0].className)
    // console.log(aaa)
</script>
</body>
</html>
複製程式碼

五、DOM屬性操作---getAttribute與setAttribute

getAttribute()方法

通過元素節點的屬性名稱獲取屬性的值。

語法:

elementNode.getAttribute(name)複製程式碼

說明:

1. elementNode:使用getElementById()、getElementsByTagName()等方法,獲取到的元素節點。

2. name:要想查詢的元素節點的屬性名字

setAttribute()方法

setAttribute() 方法增加一個指定名稱和值的新屬性,或者把一個現有的屬性設定為指定的值。

語法:

elementNode.setAttribute(name,value)複製程式碼

說明:

1.name: 要設定的屬性名。

2.value: 要設定的屬性值。

注意:

1.把指定的屬性設定為指定的值。如果不存在具有指定名稱的屬性,該方法將建立一個新屬性。

2.類似於getAttribute()方法,setAttribute()方法只能通過元素節點物件呼叫的函式

六、DOM操作之訪問子節點---childNodes

訪問選定元素節點下的所有子節點的列表,返回的值可以看作是一個陣列,他具有length屬性。

語法:

elementNode.childNodes複製程式碼

注意:

如果選定的節點沒有子節點,則該屬性返回不包含節點的 NodeList。

注意:

1. IE全系列、firefox、chrome、opera、safari相容問題

2. 節點之間的空白符,在firefox、chrome、opera、safari瀏覽器是文字節點,如下圖所示:

如果把程式碼改成這樣:

<ul><li>javascript</li><li>jQuery</li><li>PHP</li></ul>

執行結果:(IE和其它瀏覽器結果是一樣的)

  UL子節點個數:3
  節點型別:1複製程式碼

七、DOM操作之訪問子節點的第一和最後項---firstChild與lastChild

一、firstChild 屬性返回‘childNodes’陣列的第一個子節點。如果選定的節點沒有子節點,則該屬性返回 NULL。

語法:

node.firstChild複製程式碼

說明:與elementNode.childNodes[0]是同樣的效果。

二、 lastChild 屬性返回‘childNodes’陣列的最後一個子節點。如果選定的節點沒有子節點,則該屬性返回 NULL。

語法:

node.lastChild複製程式碼

說明:與elementNode.childNodes[elementNode.childNodes.length-1]是同樣的效果。

注意: 上一節中,我們知道Internet Explorer 會忽略節點之間生成的空白文字節點,而其它瀏覽器不會。我們可以通過檢測節點型別,過濾子節點。 (以後章節講解)

八、DOM操作之訪問父節點---parentNode

獲取指定節點的父節點

語法:

elementNode.parentNode複製程式碼

注意:父節點只能有一個。

看看下面的例子,獲取 P 節點的父節點,程式碼如下:

<div id="text">
  <p id="con"> parentNode 獲取指點節點的父節點</p>
</div> 
<script type="text/javascript">
  var mynode= document.getElementById("con");
  document.write(mynode.parentNode.nodeName);
</script>複製程式碼

執行結果:

parentNode 獲取指點節點的父節點
DIV複製程式碼

訪問祖節點:

elementNode.parentNode.parentNode複製程式碼

程式碼如下:

<div id="text">  
  <p>
    parentNode      
    <span id="con"> 獲取指點節點的父節點</span>
  </p>
</div> 
<script type="text/javascript">
  var mynode= document.getElementById("con");
  document.write(mynode.parentNode.parentNode.nodeName);
</script>複製程式碼

執行結果:

parentNode獲取指點節點的父節點
DIV複製程式碼

注意: 瀏覽器相容問題,chrome、firefox等瀏覽器標籤之間的空白也算是一個文字節點。

九、訪問兄弟節點

1. nextSibling 屬性可返回某個節點之後緊跟的節點(處於同一樹層級中)。

語法:

nodeObject.nextSibling複製程式碼

說明:如果無此節點,則該屬性返回 null。

2. previousSibling 屬性可返回某個節點之前緊跟的節點(處於同一樹層級中)。

語法:

nodeObject.previousSibling  複製程式碼

說明:如果無此節點,則該屬性返回 null。

注意: 兩個屬性獲取的是節點。Internet Explorer 會忽略節點間生成的空白文字節點(例如,換行符號),而其它瀏覽器不會忽略。

十、DOM節點操作之插入節點---appendChild()

在指定節點的最後一個子節點列表之後新增一個新的子節點。

語法:

appendChild(newnode)複製程式碼

引數:

newnode:指定追加的節點。

我們來看看,div標籤內建立一個新的 P 標籤,程式碼如下:

十一、DOM節點操作之插入節點---插入節點insertBefore()

insertBefore() 方法可在已有的子節點前插入一個新的子節點。

語法:

insertBefore(newnode,node);

引數:

newnode: 要插入的新節點。

node: 指定此節點前插入節點。

我們在來看看下面程式碼,在指定節點前插入節點。

十二、DOM節點操作之刪除節點---removeChild()

removeChild() 方法從子節點列表中刪除某個節點。如刪除成功,此方法可返回被刪除的節點,如失敗,則返回 NULL。

語法:

nodeObject.removeChild(node)複製程式碼

引數:

node :必需,指定需要刪除的節點。

我們來看看下面程式碼,刪除子點。

十三、DOM節點操作之替換元素節點---replaceChild()

replaceChild 實現子節點(物件)的替換。返回被替換物件的引用。

語法:

node.replaceChild (newnode,oldnew ) 複製程式碼

引數:

newnode : 必需,用於替換 oldnew 的物件。
oldnew : 必需,被 newnode 替換的物件。

我們來看看下面的程式碼:

效果: 將文件中的 Java 改為 JavaScript。

注意:

1. 當 oldnode 被替換時,所有與之相關的屬性內容都將被移除。

2. newnode 必須先被建立。 

十四、DOM操作之建立元素節點---createElement()

createElement()方法可建立元素節點。此方法可返回一個 Element 物件。

語法:

document.createElement(tagName)複製程式碼

引數:

tagName:字串值,這個字串用來指明建立元素的型別。

注意:要與appendChild() 或 insertBefore()方法聯合使用,將元素顯示在頁面中。

十五、DOM操作之建立文字節點---createTextNode

createTextNode() 方法建立新的文字節點,返回新建立的 Text 節點。

語法:

document.createTextNode(data)複製程式碼

引數:

data : 字串值,可規定此節點的文字


相關文章