zoukankan      html  css  js  c++  java
  • DOM的概念及子节点类型

    前言

    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种节点类型只做概述,希望本文对大家能有所帮助。

     

      

     

  • 相关阅读:
    JDK源码那些事儿之LinkedBlockingQueue
    JDK源码那些事儿之并发ConcurrentHashMap上篇
    JDK源码那些事儿之ArrayBlockingQueue
    JDK源码那些事儿之HashMap.TreeNode
    mycat使用schema配置
    redis连接数高居不下,怎么破?。。。。这么破
    修改tomcat使用的的编码方式
    centos6.x下让redis以服务方式运行
    mycatrule
    HTML和XML中的转义字符
  • 原文地址:https://www.cnblogs.com/andyhxl/p/6052911.html
Copyright © 2011-2022 走看看