DOM的概念及子節點類型

来源:http://www.cnblogs.com/andyhxl/archive/2016/11/10/6052911.html
-Advertisement-
Play Games

前言 DOM的作用是將網頁轉為一個javascript對象,從而可以使用javascript對網頁進行各種操作(比如增刪內容)。瀏覽器會根據DOM模型,將HTML文檔解析成一系列的節點,再由這些節點組成一個樹狀結構。DOM的最小組成單位叫做節點(node),文檔的樹形結構(DOM樹)由12種類型的節 ...


前言

DOM的作用是將網頁轉為一個javascript對象,從而可以使用javascript對網頁進行各種操作(比如增刪內容)。瀏覽器會根據DOM模型,將HTML文檔解析成一系列的節點,再由這些節點組成一個樹狀結構。DOM的最小組成單位叫做節點(node),文檔的樹形結構(DOM樹)由12種類型的節點組成。

 

一:DOM ==> 全稱: document Object Mode   文檔對象模型

文檔: html頁面

文檔對象:頁面元素(節點)

文檔對象模型: W3C標准定義:為了能夠使用javascript去操作頁面中的元素定義出來的標準

 

二:DOM會把文檔當成一節點樹,文檔裡面的每一個元素都是一個節點。同時定義了很多方法來操作這些節點(元素)

三:屬性

  什麼是屬性:

    1.使用的時候不用再前面加括弧

    2.一個屬性肯定是某個對象下麵的,所以在使用的時候肯定是調用某個對象(元素)下麵的屬性

  元素.childNodes     (存在相容性,不推薦使用,推薦使用另一個 children)

      元素.children  (不管在標準還是非標準下,只包含元素類型的節點。推薦使用

    特點:只讀屬性。

    代表:子節點列表集合,試劑盒就有長度,可使用數組形式獲取

    只包含兒子子節點,不包含孫子子節點

    獲取:實行 [] 下表獲取

    標準模式下(非IE):childNodes 包含了文本和元素類型節點,也會包含非法嵌套的子節點(註意:不是孫子節點)

    非標準:childNodes只包含元素類型的節點。ie7以不會包含非法嵌套子節點

    ul元素下麵的所有子元素都包括在這個childNodes屬性裡面

    訪問ul裡面的所有 li 子元素形式:

      var oul =  document.getElementById('ul');

      oul.childNodes.length    // 9  標準模式下

1 <ul id='ul'>
2     <li>1</li>
3     <li>2</li>
4     <li>3</li>
5     <li>4</li>
6 </ul>

為什麼是9呢?

DOM裡面定義了12種節點:

一般地,節點至少擁有nodeTypenodeNamenodeValue這三個基本屬性。

元素.nodeType     1 

  只讀屬性,代表當前元素的類型

  nodeType屬性返回節點類型的常數值。不同的類型對應不同的常數值,12種類型分別對應1到12的常數值

 

元素.attributes

  只讀屬性,代表當前元素的屬性是什麼(如:id,border,,,等屬性)

  屬性列表集合

  屬性的名稱:元素.attributes[0].name

  屬性的值:元素.attributes[0].value

 

 1 <ul id='ul' style= 'color','red'>
 2     <li>1</li>
 3     <li>2</li>
 4     <li>3</li>
 5     <li>4</li>
 6 </ul>
 7 
 8 var oul =  document.getElementById('ul');
 9 oul.attributes.length  //2
10 oul.attributes[0].name  //id
11 元素.attributes[1].value  //red

 

 

--------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------

     元素節點                   Node.ELEMENT_NODE(1)   nodeType值: 1

     屬性節點                   Node.ATTRIBUTE_NODE(2)  nodeType值: 2

     文本節點                   Node.TEXT_NODE(3)  nodeType值: 3

     CDATA節點                    Node.CDATA_SECTION_NODE(4)   nodeType值: 4

     實體引用名稱節點        Node.ENTRY_REFERENCE_NODE(5)  nodeType值: 5

     實體名稱節點             Node.ENTITY_NODE(6)  nodeType值: 6

     處理指令節點             Node.PROCESSING_INSTRUCTION_NODE(7)   nodeType值: 7

     註釋節點                      Node.COMMENT_NODE(8)   nodeType值: 8

     文檔節點                      Node.DOCUMENT_NODE(9)   nodeType值: 9

     文檔類型節點            Node.DOCUMENT_TYPE_NODE(10)   nodeType值: 10

     文檔片段節點            Node.DOCUMENT_FRAGMENT_NODE(11)   nodeType值: 11

     DTD聲明節點                 Node.NOTATION_NODE(12)   nodeType值: 12

 

--------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------

DOM定義了一個Node介面,這個介面在javascript中是作為Node類型實現的,而在IE8-瀏覽器中的所有DOM對象都是以COM對象的形式實現的。所以,IE8-瀏覽器並不支持Node對象的寫法

 1 //在標準瀏覽器下返回1,而在IE8-瀏覽器中報錯,提示Node未定義  2 console.log(Node.ELEMENT_NODE);//1 

nodeName

nodeName屬性返回節點的名稱

nodeValue

nodeValue屬性返回或設置當前節點的值,格式為字元串

 

接下來,將按照節點類型的常數值對應順序,從1到12進行詳細說明

【1】元素節點

元素節點element對應網頁的HTML標簽元素。元素節點的節點類型nodeType值是1,節點名稱nodeName值是大寫的標簽名,nodeValue值是null

以body元素為例

1 // 1 'BODY' null
2 console.log(document.body.nodeType,document.body.nodeName,document.body.nodeValue)
3 console.log(Node.ELEMENT_NODE === 1);//true

【2】特性節點

元素特性節點attribute對應網頁中HTML標簽的屬性,它只存在於元素的attributes屬性中,並不是DOM文檔樹的一部分。特性節點的節點類型nodeType值是2,節點名稱nodeName值是屬性名,nodeValue值是屬性值

現在,div元素有id="test"的屬性

1 <div id="test"></div>
2 <script>
3     var attr = test.attributes.id;
4     //2 'id' 'test'
5     console.log(attr.nodeType,attr.nodeName,attr.nodeValue)
6     console.log(Node.ATTRIBUTE_NODE === 2);//true 
7 </script>

【3】文本節點

文本節點text代表網頁中的HTML標簽內容。文本節點的節點類型nodeType值是3,節點名稱nodeName值是'#text',nodeValue值是標簽內容值

現在,div元素內容為'測試'

1 <div id="test">測試</div>
2 <script>
3     var txt = test.firstChild;
4     //3 '#text' '測試'
5     console.log(txt.nodeType,txt.nodeName,txt.nodeValue)
6     console.log(Node.TEXT_NODE === 3);//true 
7 </script>

【4】CDATA節點

CDATASection類型只針對基於XML的文檔,只出現在XML文檔中,表示的是CDATA區域,格式一般為

1 <![CDATA[
2 ]]>

該類型節點的節點類型nodeType的值為4,節點名稱nodeName的值為'#cdata-section',nodevalue的值是CDATA區域中的內容

【5】實體引用名稱節點

實體是一個聲明,指定了在XML中取代內容或標記而使用的名稱。 實體包含兩個部分, 首先,必須使用實體聲明將名稱綁定到替換內容。 實體聲明是使用 <!ENTITY name "value"> 語法在文檔類型定義(DTD)或XML架構中創建的。其次,在實體聲明中定義的名稱隨後將在 XML 中使用。 在XML中使用時,該名稱稱為實體引用。

實體引用名稱節點entry_reference的節點類型nodeType的值為5,節點名稱nodeName的值為實體引用的名稱,nodeValue的值為null

1 //實體名稱
2 <!ENTITY publisher "Microsoft Press">
3 //實體名稱引用
4 <pubinfo>Published by &publisher;</pubinfo>

【6】實體名稱節點
上面已經詳細解釋過,就不再贅述

該節點的節點類型nodeType的值為6,節點名稱nodeName的值為實體名稱,nodeValue的值為null

【7】處理指令節點

處理指令節點ProcessingInstruction的節點類型nodeType的值為7,節點名稱nodeName的值為target,nodeValue的值為entire content excluding the target

【8】註釋節點

註釋節點comment表示網頁中的HTML註釋。註釋節點的節點類型nodeType的值為8,節點名稱nodeName的值為'#comment',nodeValue的值為註釋的內容

現在,在id為myDiv的div元素中存在一個<!-- 我是註釋內容 -->

1 <div id="myDiv"><!-- 我是註釋內容 --></div>
2 <script>
3     var com = myDiv.firstChild;
4     //8 '#comment' '我是註釋內容'
5     console.log(com.nodeType,com.nodeName,com.nodeValue)
6     console.log(Node.COMMENT_NODE === 8);//true 
7 </script>

【9】文檔節點

文檔節點document表示HTML文檔,也稱為根節點,指向document對象。文檔節點的節點類型nodeType的值為9,節點名稱nodeName的值為'#document',nodeValue的值為null

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6 </head>
 7 <body>
 8 <script>
 9     var nodeDocumentType = document.firstChild;
10     //10 "html" null
11     console.log(nodeDocumentType.nodeType,nodeDocumentType.nodeName,nodeDocumentType.nodeValue);
12     console.log(Node.DOCUMENT_TYPE_NODE === 10);
13 </script>
14 </body>
15 </html>

【11】文檔片段節點

文檔片段節點DocumentFragment在文檔中沒有對應的標記,是一種輕量級的文檔,可以包含和控制節點,但不會像完整的文檔尋親戰勝額外的資源。該節點的節點類型nodeType的值為11,節點名稱nodeName的值為'#document-fragment',nodeValue的值為null

1 <script>
2     var nodeDocumentFragment = document.createDocumentFragment(); 
3     //11 "#document-fragment" null
4     console.log(nodeDocumentFragment.nodeType,nodeDocumentFragment.nodeName,nodeDocumentFragment.nodeValue);
5     console.log(Node.DOCUMENT_FRAGMENT_NODE === 11);//true
6 </script>

【12】DTD聲明節點

DTD聲明節點notation代表DTD中聲明的符號。該節點的節點類型nodeType的值為12,節點名稱nodeName的值為符號名稱,nodeValue的值為null 

總結

在這12種DOM節點類型中,有一些適用於XML文檔,有一些是不常用的類型。而對於常用類型,後面會陸續進行詳細介紹,本文對這12種節點類型只做概述,希望本文對大家能有所幫助。

 

 

 

  

 

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在寫一個時間判斷腳本,需要將固定好的字元串時間轉換為時間戳進行比較,在做的時候個人習慣使用chrome作為調試工具, 代碼基本完成之後,一切正常; 使用其他瀏覽器訪問,好嘛,IE跟safari都不相容,返回錯誤"Invalid Date"。 想著估計是字元串格式的問題,改成'2016/11/11 ...
  • ...
  • 公司對於搭建本地私有npm庫有如下要求: 私有包托管在內部伺服器中 項目中使用了公共倉庫上的公共包,也使用了內部伺服器上的私有包 希望下載的時候,公共包走公共倉庫,私有包走內部伺服器的私有倉庫 伺服器硬碟有限,希望只緩存下載過的包,而不是全部同步。 ... ...
  • 關於egret接入第三方庫的方法,egret也有文檔,可參考官方的接入方法接入http://developer.egret.com/cn/github/egret-docs/extension/threes/instructions/index.html。 這裡記錄一下接入puremvc庫的過程,關 ...
  • 在複習廖雪峰老師的JS教程時,看到數組,又遇到了之前做過的那道小題,題目如下: 練習:在新生歡迎會上,你已經拿到了新同學的名單,請排序後顯示:歡迎XXX,XXX,XXX和XXX同學!: 給出了數組: 這道題作為一個練習並不是很難,當時自己第一次看也是按照最直接的辦法,使用了${arr[i]}來拿到對 ...
  • Redux就是個數據中心,不依附於任何框架在哪使用都行。但是和它最搭配的應該就是React了,而且大家學習它的動力大多也是解決React狀態管理的問題。都說Redux文檔詳盡清晰,但我感覺並不友好,它沒有用最簡單直觀的方式告訴你如何搭配React使用。研究了兩天的文檔和示例,終於在項目中用上了我認為 ...
  • 目前 "AlloyFinger" 作為騰訊手機QQ web手勢解決方案,在各大項目中都發揮著作用。 感興趣的同學可以去Github看看: "https://github.com/AlloyTeam/AlloyFinger" 在騰訊,如:興趣部落、QQ群、QQ動漫、騰訊學院、TEDxTencent、 ...
  • 1、跨域請求: Cross Domain Request:跨功能變數名稱的HTTP請求,瀏覽器從某個功能變數名稱下的資源訪問了另一功能變數名稱下的另一資源(協議、功能變數名稱或是埠號不同); ①瀏覽器允許跨域請求的情形: <img>、<link>、<script>、<iframe> ②禁止跨域請求的情形: XHR——瀏覽器預設出 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...