DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口)。DOM描绘了一个层次变化的节点树,允许开发人员添加、移除和修改页面的某一部分。
一、节点层次
在html页面中,文档元素始终都是元素。
1. Node类型
JavaScript中的所有节点类型都继承自Node类型,因此所有节点类型都共享着相同的基本属性和方法。
(1)nodeType属性:用于表明节点的类型。
| 常量 | 值 |
|---|---|
| Node.ELEMENT_NODE | 1 |
| Node.ATTRIBUTE_NODE | 2 |
| Node.TEXT_NODE | 3 |
| Node.CDATA_SECTION_NODE | 4 |
| Node.ENTITY_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 |
| Node.NOTATION_NODE | 12 |
需要注意的是,在IE中不支持常量
if(someNode.nodeType === 1){ // 不使用Node.ELEMENT_NODE
console.log("node is an element");
}123(2)nodeName和nodeValue
if(someNode.nodeType === 1){ var name = someNode.nodeName, // 元素的标签名 value = someNode.nodeValue; // null
console.log(name, value);
}12345(3)节点关系
文档中所有节点之间都存在着这样或那样的关系。节点间的各种关系可以用传统的家族关系来描述,相对于把文档树比喻成家谱。
立即学习“Java免费学习笔记(深入)”;
| 属性 | 说明 |
|---|---|
| childNodes | 直接子元素;nodeList对象,保存一组有序节点,可通过位置访问 |
| parentNode | 文档树中的父节点 |
| previousSibling | 前一个兄弟节点 |
| nextSibling | 后一个兄弟节点 |
| firstChild | 第一个子节点 |
| lastChild | 最后一个子节点 |
| ownerDocument | 整个文档的文档节点Document |
说明:
hasChildNodes()在节点包含一个或多个子节点的情况下返回true
NodeList对象拥有length属性,但并不是Array实例;其是基于DOM结构动态执行查询的结果,因此DOM结构的变化能够自动反应在NodeList对象中。可以通过方括号,也可以使用item()方法访问NodeList中的节点。
示例:
12345李刚
ligang
http://www.php.cn
var div = document.getElementById("content");console.log(div.hasChildNodes()); // trueconsole.log(div.ownerDocument);
// #documentvar children = div.childNodes;console.log(children[0]);
// 李刚
注意:这里有可能是#text,格式化回车缩进导致!!console.log(children.item(1));
// ligang
var p1 = div.firstChild;console.log(p1.parentNode);
// …console.log(p1.previousSibling);
// nullconsole.log(p1.nextSibling);
// ligang
123456789101112(4)操作节点
因为关系指针是只读的,所以DOM提供了一些操作节点的方法。
| 方法 | 说明 |
|---|---|
| appendChild(newDom) | 向childNode列表的末尾添加一个节点 |
| inserBefore(newDom, 参照节点) | 新插入的节点作为参照节点的同胞节点,同时返回该插入节点 |
| replaceChild(newDom, 被替换的节点) | 新插入的节点将占据被替换节点的位置 |
| removeChild(要移除的节点) | 返回被移除的节点,被移除的节点仍然为稳当所有,只是在文档中没有了位置 |
注意:并不是所有节点都有子节点,如果在不支持子节点的节点上调用了上述方法,将会导致错误发生。
示例:将blog元素移动到content中
李刚
http://www.php.cn
12345
var div = document.getElementById("content"),
p = document.getElementById("blog");div.appendChild(p);12312345李刚
http://www.php.cn
说明:如果传入到appendChild()中的节点已经是文档的一部分了,那结果就是将该节点从原来的位置转移到新位置。
示例:将blog作为content的第一个子元素,将company作为content的最后一个子元素
李刚
http://www.php.cn
ptmind
123456
var content = document.getElementById("content"),
blog = document.getElementById("blog"),
company = document.getElementById("company");content.insertBefore(blog, content.childNodes.item(0));
// content.firstChildcontent.insertBefore(company, null);12345123456李刚
http://www.php.cn
ptmind
(5)其他方法
| 方法 | 说明 |
|---|---|
| cloneNode(boolean) | true:复制节点及整个子节点树;false:只复制节点本身 |
| normalize() | 处理文档树中的文本节点 |
所有节点都有上述方法!
2. Document类型
JavaScript通过Document类型表示文档。在浏览器中,document对象是HTMLDocument的一个实例,表示整个HTML页面。而且,document对象是window对象的一个属性。
document.documentElement; // 获取对的引用document.body; // 获取对的引用/* 以本人blog为例 */document.title; // 获取页面title信息:"李刚的学习专栏 - 博客频道 - CSDN.NET"document.URL; // 获取页面完整的URL:"http://www.php.cn"document.domain; // 获取页面的域名:"blog.csdn.net" document.referrer; // 获取链接到当前页面的那个页面的URL:直接访问为空!1234567
技巧:由于跨域安全限制,来自不同子域的页面无法通过JavaScript通信。而通过将每个页面的document.domain设置为相同的值,这些页面就可以互相访问对方包含的JavaScript对象了。例如,在www.xxx.com中嵌入了一框架,框架内页面加载自report.xxx.com;两者不能进行访问。可以将两个页面的document.domain值都设置为xxx.com,就可以互相访问了。
需要注意的是,浏览器对domain有一限制,即如果域名开始时松散的(xxx.com),那么不能将它再设置为紧绷的(www.xxx.com)。
(1)查找元素
| 方法 | 说明 |
|---|---|
| getElementById() | 只返回文档中第一次出现的元素;如果不存在带有相应id的元素,则返回null |
| getElementsByTagName() | 返回的是包含零或多个元素的HTMLCollection对象 |
| getElementsByName() | 返回带有指定name特性的所有元素 |
var images = document.getElementsByTagName("img");images.item(0);images.namedItem("myImage");123上述两种方式都可以通过[]代替。在后台,对数值索引会调用item(),对字符串索引会调用namedItem()。
(2)特殊集合
| 属性 | 说明 |
|---|---|
| document.anchors | 包含文档中所有带name特性的元素 |
| document.applets | 包含文档中所有的元素 |
| document.forms | 包含文档中所有的元素 |
| document.images | 包含文档中所有的@@##@@元素 |
| document.links | 包含文字所有带href特性的元素 |
(3)DOM一致性检测
document.implementation.hasFeature("名称", "版本号");document.implementation.hasFeature("XML", "1.0"); // true12存在实现与规范不一致的情况,所以建议除了检测hasFeature()之外,还同时使用能力检测。
(4)文档写入
| 方法 | 说明 |
|---|---|
| write() | 原样写入 |
| writeln() | 在字符串末尾添加有一个换行符(\n) |
| open() | 打开网页输出流 |
| close() | 关闭网页输出流 |
示例:
my name is:
document.write("ligang"); // my name is: ligangwindow.onload = function(){
document.write("ligang"); // ligang};12345在文档加载结束后再调用document.write(),输出的内容将会重写整个页面。 write()、writeln()可以动态包含外部资源,需注意不能直接包含"",因为其会被解释为脚本块的结束。
document.write("
相关专题
本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。
90
2026.02.06
本专题汇总了快手网页版的最新入口地址和电脑版使用方法,详细提供快手官网直接访问链接、网页端操作教程,以及如何无需下载安装直接观看短视频的方式,帮助用户轻松浏览和观看快手短视频内容。
15
2026.02.06
本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。
10
2026.02.06
本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。
6
2026.02.06
本专题深入讲解 JavaScript 异步编程与事件驱动架构,涵盖 Promise、async/await、事件循环机制、回调函数、任务队列与微任务队列、以及如何设计高效的异步应用架构。通过多个实际示例,帮助开发者掌握 如何处理复杂异步操作,并利用事件驱动设计模式构建高效、响应式应用。
7
2026.02.06
热门下载
相关下载
精品课程
最新文章





