0

0

javascript--DOM讲解

巴扎黑

巴扎黑

发布时间:2017-08-09 11:31:26

|

1527人浏览过

|

来源于php中文网

原创

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中的节点。
    节点关系

示例

<div id="content">    <p>李刚</p>    <p>ligang</p>    <p>http://www.php.cn</p></div>12345
var div = document.getElementById("content");console.log(div.hasChildNodes());   // trueconsole.log(div.ownerDocument); 
    // #documentvar children = div.childNodes;console.log(children[0]);    
       // <p>李刚</p>  注意:这里有可能是#text,格式化回车缩进导致!!console.log(children.item(1)); 
        // <p>ligang</p>var p1 = div.firstChild;console.log(p1.parentNode);      
           // <div id="content">…</div>console.log(p1.previousSibling);  
             // nullconsole.log(p1.nextSibling);     
                // <p>ligang</p>123456789101112

(4)操作节点
因为关系指针是只读的,所以DOM提供了一些操作节点的方法。

方法 说明
appendChild(newDom) 向childNode列表的末尾添加一个节点
inserBefore(newDom, 参照节点) 新插入的节点作为参照节点的同胞节点,同时返回该插入节点
replaceChild(newDom, 被替换的节点) 新插入的节点将占据被替换节点的位置
removeChild(要移除的节点) 返回被移除的节点,被移除的节点仍然为稳当所有,只是在文档中没有了位置

注意:并不是所有节点都有子节点,如果在不支持子节点的节点上调用了上述方法,将会导致错误发生。
示例:将blog元素移动到content中

<!-- 执行前 --><div id="content">    <p>李刚</p></div><p id="blog">http://www.php.cn</p>12345
var div = document.getElementById("content"),
    p = document.getElementById("blog");div.appendChild(p);123
<!-- 执行后 --><div id="content">    <p>李刚</p>    <p id="blog">http://www.php.cn</p></div>12345

说明:如果传入到appendChild()中的节点已经是文档的一部分了,那结果就是将该节点从原来的位置转移到新位置。

示例:将blog作为content的第一个子元素,将company作为content的最后一个子元素

<!-- 执行前 --><div id="content">    <p>李刚</p></div><p id="blog">http://www.php.cn</p><p id="company">ptmind</p>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);12345
<!-- 执行后 --><div id="content">    <p>李刚</p>    <p id="blog">http://www.php.cn</p>    <p id="company">ptmind</p></div>123456

(5)其他方法

方法 说明
cloneNode(boolean) true:复制节点及整个子节点树;false:只复制节点本身
normalize() 处理文档树中的文本节点

所有节点都有上述方法!

2. Document类型

JavaScript通过Document类型表示文档。在浏览器中,document对象是HTMLDocument的一个实例,表示整个HTML页面。而且,document对象是window对象的一个属性。

document.documentElement; // 获取对<html>的引用document.body;  // 获取对<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)查找元素

Movio
Movio

AI真人出镜视频讲解

下载
方法 说明
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() 关闭网页输出流

示例:

<span>my name is:</span>
document.write("<strong>ligang</strong>");  // my name is: ligangwindow.onload = function(){
    document.write("<strong>ligang</strong>"); // ligang};12345

在文档加载结束后再调用document.write(),输出的内容将会重写整个页面。
write()、writeln()可以动态包含外部资源,需注意不能直接包含"",因为其会被解释为脚本块的结束。

document.write("<script type=\"text/javascript\" src=\"file.js\"><\/script>"); // ligang1

3. Element类型

Element类型用于表现XML和HTML元素。可以通过nodeName或tagName属性获取元素的标签名。
注意:在HTML中,标签名都以大写字母表示;在XML中,标签名始终与源代码中的保持一致。
(1)HTML元素的标准特性
示例:
<div id="myDiv" title="ligang Demo" lang="zh" dir="ltr"></div>class="bd bf">http://www.php.cn<br>

属性 说明
div.id 元素在文档中的唯一标识符 “myDiv”
div.title 附件说明信息,悬停展示 “ligang Demo”
div.lang 元素内容的语言代码 “zh”
div.dir 语言方向:ltr左到右;rtly右到左 “ltr”
div.className CSS类 “bd bf”

(2)特性
获取特性:dom.getAttribute("特性名") 如不存在返回null

注意有两类特殊的特性:

  • style,返回CSS文本,通过属性访问则返回一个对象;

  • onclick等事件处理程序,返回相应代码的字符串。

示例

<a href="javscript:;" style="background-color: grey;text-underline: none;"
   onclick="function(){console.log('la')}">http://www.php.cn/ligang2585116</a>12
var a = document.getElementsByTagName("a")[0];
a.getAttribute("style");    // "background-color: grey;text-underline: none;"a.style;    // CSSStyleDeclaration {0: "background-color", all: ""…}
a.getAttribute("onclick");  // "function(){console.log('la')}"1234

设置特性:dom.setAttribute("特性名","值")
(3)attributes属性
attributes属性中包含一个NamedNodeMap

属性 说明
dom.attributes.getNamedItem(name) 返回nodeName属性等于name的节点
dom.attributes.removeNamedItem(name) 从列表中移除nodeName属性等于name的节点
dom.attributes.setNamedItem(attr) 向列表中添加节点,以节点的nodeName属性为索引
dom.attributes.item(pos) 返回位于数字pos位置处的节点

示例:设置属性

// 方式一:示例:setNamedItem
var target = document.createAttribute("target");target.nodeValue = "_blank";a.attributes.setNamedItem(target);// 方式二:setAttribute
a.setAttribute("target", "_blank");123456

(5)创建元素

document.createElement("元素名/完整元素");1

创建新元素的同时,也为新元素设置了ownerDocument属性。
示例:创建元素并添加到文档树

var a = document.createElement("a");a.href = "http://www.php.cn";a.text = "http://blog.csdn.net/ligang2585116";document.body.appendChild(a);1234

(6)元素的子节点
元素可以有任意数量的子节点和后代节点。
示例:为了兼容浏览器差异

for(var i = 0, len = element.childNodes.length; i < len; i++){    if(element.childNodes[i].nodeType === 1){        // 执行某些操作
    }
}12345

4. Text类型

文本节点由Text类型表示,包含纯文本。纯文本可以包含转义后的HTML字符,但不能包含HTML代码。
(1)创建文本节点:document.createTextNode("文本")
(2)规范化文本节点:在一个包含两个或多个文本节点元素上调用normalize(),则将会所有文本节点合并成一个节点。
(3)分割文本节点:将一个文本节点分成两个文本节点,按指定的位置分割nodeValue值。
示例:规范化文本节点

var div = document.getElementById("content");var textNode = document.createTextNode("Hello"),
    anotherNode = document.createTextNode("Ligang");div.appendChild(textNode);div.appendChild(anotherNode);console.log(div.childNodes.length);
     // 2div.normalize();console.log(div.childNodes.length); 
     // 1var newNode = div.firstChild.splitText(5);  
     // "Ligang"console.log(div.childNodes.length); // 212345678910

5. Comment类型

注释在DOM中是通过Comment类型来表示的。
Comment类型与Text类型继承自相同的基类,因此它拥有除了splitText()之外的所有方法,当然也可通过nodeValue或data属性来取得注释的内容。

6. DocumentFragement类型

DocumentFragement类型中没有对应的标记,DOM规定文档片段是一种“轻量级”的文档,可以包含和控制节点,但不会像完整的文档那样占用额外的资源。可以当做“仓库”使用。
示例

var fragment = document.createDocumentFragment();var li = null;for(var i = 0; i < 5; i++){
    li = document.createElement("li");
    li.appendChild(document.createTextNode("Item "+ (i+1)));
    fragment.appendChild(li);
}// 文档片段的所有子节点都被删除并转移到<ul>元素中document.getElementById("myUl").appendChild(fragment);123456789

7. 其他类型

CDATASection类型、DocumentType类型很少用到,这里不再赘述。

二、DOM操作技术

1. 动态脚本

在元素添加到页面之前,是不会下载外部文件的。(不同于image)
相关内容请查看:事件:事件类型-UI事件

示例:动态加载JavaScript文件

function loadScript(url){
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = url;
    document.body.appendChild(script);}123456

示例:动态加载JavaScript代码

function loadScriptString(code){    var script = document.createElement("script");
    script.type = "text/javascript";    try{
        script.appendChild(document.createTextNode(code));
    }catch (e){
        script.text = code; // 兼容IE
    }
    document.body.appendChild(script);
}12345678910

2. 动态样式

同动态加载脚本类似,添加到页面之后才会加载资源。

示例:动态加载CSSt文件

function loadStyle(url){    var link = document.createElement("link");    link.rel = "stylesheet";    link.type = "text/css";    link.href = url;
    document.head.appendChild(link);
}1234567

示例:动态加载CSS代码

function loadStyleString(code){
    var style = document.createElement("style");
    style.type = "text/css";
    try{
        style.appendChild(document.createTextNode(code));
    }catch (e){
        style.stylesheet.cssText = code;    // 兼容IE
    }
    document.head.appendChild(style);}12345678910

3. 操作表格

为了方便构建表格,HTML DOM还为<table>、<code><tbody> 和 <code><tr>元素添加了一些属性: <br>为<code><teble></teble>元素添加的属性和方法:

属性方法 说明
caption (若有)保存着对<caption></caption>元素的指针
tHead (若有)保存着对<thead>元素的指针<tr> <td align="left">tFoot</td> <td align="left">(若有)保存着对<code><tfoot>元素的指针<tr> <td align="left">tBodies</td> <td align="left" style="word-break: break-all;">一个所有<code><tbody>元素的HTMLCollection<tr> <td align="left" style="word-break: break-all;">rows</td> <td align="left">一个所有行的HTMLCollection</td> </tr> <tr> <td align="left">createCaption</td> <td align="left">创建<code><caption></caption>元素,放到表格中,返回引用
createTHead() 创建<thead>元素,放到表格中,返回引用<tr> <td align="left">createTFoot()</td> <td align="left" style="word-break: break-all;">创建<code><tfoot>元素,放到表格中,返回引用<tr> <td align="left" style="word-break: break-all;">deleteCaption()</td> <td align="left">删除<code><caption></caption>元素
deleteTHead() 删除<thead>元素<tr> <td align="left">deleteTFoot()</td> <td align="left">删除<code><tfoot>元素<tr> <td align="left">insertRow(pos)</td> <td align="left">向rows集合中的指定位置 插入一行</td> </tr> <tr> <td align="left">deleteRow(pos)</td> <td align="left">删除指定位置的一行</td> </tr> </tfoot>

<tbody>元素添加的属性和方法:<table> <thead><tr class="firstRow"> <th align="left">属性方法</th> <th align="left">说明</th> </tr></thead> <tbody><tr> <td align="left">rows</td> <td align="left">一个保存着<code><tbody>元素中行的HTMLCollection<tr> <td align="left">insertRow(pos)</td> <td align="left">向rows集合中指定位置插入一行,返回新行的引用</td> </tr> <tr> <td align="left">deleteRow(pos)</td> <td align="left">删除指定位置的行</td> </tr> </tbody>

<tr>元素添加的属性和方法:<table> <thead><tr class="firstRow"> <th align="left">属性方法</th> <th align="left">说明</th> </tr></thead> <tbody><tr> <td align="left">cells()</td> <td align="left">一个保存着<code><tr>元素中的单元格的HTMLCollection</tr> <tr> <td align="left">insertCell(pos)</td> <td align="left">向cells集合中的指定位置插入一个单元格,返回新单元格引用</td> </tr> <tr> <td align="left">deleteCell(pos)</td> <td align="left">删除指定位置的单元格</td> </tr>

总结:NodeList、NameNodeMap和HTMLColletction三个集合都是动态的。应尽量减少访问NodeList的次数,因为每次访问NodeList都会运行一次基于上下文档的查询。可以考虑将从NodeList中取得的值缓存起来!

javascript--DOM讲解

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

705

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

233

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

117

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

22

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

61

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

30

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

669

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

58

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号