浅谈Javascript中的12种DOM节点类型


Posted in Javascript onAugust 19, 2016

前言

DOM的作用是将网页转为一个javascript对象,从而可以使用javascript对网页进行各种操作(比如增删内容)。浏览器会根据DOM模型,将HTML文档解析成一系列的节点,再由这些节点组成一个树状结构。DOM的最小组成单位叫做节点(node),文档的树形结构(DOM树)由12种类型的节点组成。

属性

一般地,节点至少拥有nodeTypenodeNamenodeValue这三个基本属性。

节点类型不同,这三个属性的值也不相同

nodeType

nodeType属性返回节点类型的常数值。不同的类型对应不同的常数值,12种类型分别对应1到12的常数值

     元素节点           

     Node.ELEMENT_NODE(1)

     属性节点           

     Node.ATTRIBUTE_NODE(2)

     文本节点           

     Node.TEXT_NODE(3)

     CDATA节点                    Node.CDATA_SECTION_NODE(4)

     实体引用名称节点        Node.ENTRY_REFERENCE_NODE(5)

     实体名称节点       

   Node.ENTITY_NODE(6)

     处理指令节点       

   Node.PROCESSING_INSTRUCTION_NODE(7)

     注释节点                      Node.COMMENT_NODE(8)

     文档节点                      Node.DOCUMENT_NODE(9)

     文档类型节点       

  Node.DOCUMENT_TYPE_NODE(10)

     文档片段节点       

  Node.DOCUMENT_FRAGMENT_NODE(11)

     DTD声明节点                 Node.NOTATION_NODE(12)

DOM定义了一个Node接口,这个接口在javascript中是作为Node类型实现的,而在IE8-浏览器中的所有DOM对象都是以COM对象的形式实现的。所以,IE8-浏览器并不支持Node对象的写法

//在标准浏览器下返回1,而在IE8-浏览器中报错,提示Node未定义
console.log(Node.ELEMENT_NODE);//1

nodeName

nodeName属性返回节点的名称

nodeValue

nodeValue属性返回或设置当前节点的值,格式为字符串

接下来,将按照节点类型的常数值对应顺序,从1到12进行详细说明 

【1】元素节点

元素节点element对应网页的HTML标签元素。元素节点的节点类型nodeType值是1,节点名称nodeName值是大写的标签名,nodeValue值是null

以body元素为例

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

 

【2】特性节点

元素特性节点attribute对应网页中HTML标签的属性,它只存在于元素的attributes属性中,并不是DOM文档树的一部分。特性节点的节点类型nodeType值是2,节点名称nodeName值是属性名,nodeValue值是属性值

现在,div元素有id="test"的属性

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

【3】文本节点
文本节点text代表网页中的HTML标签内容。文本节点的节点类型nodeType值是3,节点名称nodeName值是'#text',nodeValue值是标签内容值

现在,div元素内容为'测试'

<div id="test">测试</div>
<script>
var txt = test.firstChild;
//3 '#text' '测试'
console.log(txt.nodeType,txt.nodeName,txt.nodeValue)
console.log(Node.TEXT_NODE === 3);//true 
</script>

 

【4】CDATA节点

CDATASection类型只针对基于XML的文档,只出现在XML文档中,表示的是CDATA区域,格式一般为

<![CDATA[
]]>

该类型节点的节点类型nodeType的值为4,节点名称nodeName的值为'#cdata-section',nodevalue的值是CDATA区域中的内容 

【5】实体引用名称节点

实体是一个声明,指定了在XML中取代内容或标记而使用的名称。 实体包含两个部分, 首先,必须使用实体声明将名称绑定到替换内容。 实体声明是使用 <!ENTITY name "value"> 语法在文档类型定义(DTD)或XML架构中创建的。其次,在实体声明中定义的名称随后将在 XML 中使用。 在XML中使用时,该名称称为实体引用。

实体引用名称节点entry_reference的节点类型nodeType的值为5,节点名称nodeName的值为实体引用的名称,nodeValue的值为null

//实体名称
<!ENTITY publisher "Microsoft Press">
//实体名称引用
<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元素中存在一个<!-- 我是注释内容 -->

<div id="myDiv"><!-- 我是注释内容 --></div>
<script>
var com = myDiv.firstChild;
//8 '#comment' '我是注释内容'
console.log(com.nodeType,com.nodeName,com.nodeValue)
console.log(Node.COMMENT_NODE === 8);//true 
</script>

【9】文档节点

文档节点document表示HTML文档,也称为根节点,指向document对象。文档节点的节点类型nodeType的值为9,节点名称nodeName的值为'#document',nodeValue的值为null

<script>
//9 "#document" null
console.log(document.nodeType,document.nodeName,document.nodeValue)
console.log(Node.DOCUMENT_NODE === 9);//true 
</script>
 

【10】文档类型节点

文档类型节点DocumentType包含着与文档的doctype有关的所有信息。文档类型节点的节点类型nodeType的值为10,节点名称nodeName的值为doctype的名称,nodeValue的值为null

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
var nodeDocumentType = document.firstChild;
//10 "html" null
console.log(nodeDocumentType.nodeType,nodeDocumentType.nodeName,nodeDocumentType.nodeValue);
console.log(Node.DOCUMENT_TYPE_NODE === 10);
</script>
</body>
</html>

【11】文档片段节点

文档片段节点DocumentFragment在文档中没有对应的标记,是一种轻量级的文档,可以包含和控制节点,但不会像完整的文档寻亲战胜额外的资源。该节点的节点类型nodeType的值为11,节点名称nodeName的值为'#document-fragment',nodeValue的值为null

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

【12】DTD声明节点

DTD声明节点notation代表DTD中声明的符号。该节点的节点类型nodeType的值为12,节点名称nodeName的值为符号名称,nodeValue的值为null 

总结

在这12种DOM节点类型中,有一些适用于XML文档,有一些是不常用的类型。而对于常用类型,后面会陆续进行详细介绍,本文对这12种节点类型只做概述,希望本文对大家能有所帮助。

Javascript 相关文章推荐
jQuery代码优化 选择符篇
Nov 01 Javascript
js 有框架页面跳转(target)三种情况下的应用
Apr 09 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
Dec 04 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
Dec 04 Javascript
JS实现的网页背景闪电闪烁效果代码
Oct 17 Javascript
AngularJS入门心得之directive和controller通信过程
Jan 25 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
Apr 20 Javascript
Ext JS 实现建议词模糊动态搜索功能
May 13 Javascript
Angular4实现动态添加删除表单输入框功能
Aug 11 Javascript
微信小程序实现轮播图效果
Sep 07 Javascript
webstorm+vue初始化项目的方法
Oct 18 Javascript
利用JavaScript为句子加标题的3种方法示例
Jan 05 Javascript
js实现select选择框效果及美化
Aug 19 #Javascript
JavaScript面向对象编写购物车功能
Aug 19 #Javascript
javascript设计模式之module(模块)模式
Aug 19 #Javascript
JS实现六位字符密码输入器功能
Aug 19 #Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
Aug 19 #Javascript
巧用jQuery选择器提高写表单效率的方法
Aug 19 #Javascript
JS获取中文拼音首字母并通过拼音首字母快速查找页面内对应中文内容的方法【附demo源码】
Aug 19 #Javascript
You might like
NT IIS下用ODBC连接数据库
2006/10/09 PHP
PHP中array_slice函数用法实例详解
2014/11/25 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
php 实现Hash表功能实例详解
2016/11/29 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
2017/11/08 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
2020/06/03 PHP
jQuery 动态酷效果实现总结
2009/12/27 Javascript
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
js仿百度切换皮肤功能(html+css)
2016/07/10 Javascript
AngularJS入门教程之静态模板详解
2016/08/18 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
2017/07/19 jQuery
js指定日期增加指定月份的实现方法
2018/12/19 Javascript
关于AngularJS中几种Providers的区别总结
2020/05/17 Javascript
python常规方法实现数组的全排列
2015/03/17 Python
用python写一个windows下的定时关机脚本(推荐)
2017/03/21 Python
python使用opencv读取图片的实例
2017/08/17 Python
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
Python生成器定义与简单用法实例分析
2018/04/30 Python
python中单例常用的几种实现方法总结
2018/10/13 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
2019/04/03 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
Python Json数据文件操作原理解析
2020/05/09 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
澳大利亚领先的美容护肤品零售商之一:SkincareStore
2018/01/22 全球购物
大学生物业管理求职信
2013/10/24 职场文书
工作说明书范文
2014/05/07 职场文书
假期安全教育广播稿
2014/10/04 职场文书
汇报材料怎么写
2014/12/30 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
Java内存模型之happens-before概念详解
2021/06/13 Java/Android