《JavaScript高级程序设计》- 第十四章:DOM

本文详细介绍了DOM(文档对象模型)的相关知识,包括节点层级、DOM编程、MutationObserver接口等。重点讲解了Node类型、Document类型、Element类型、Text类型、Comment类型以及MutationObserver的基本用法和性能优化。此外,还探讨了动态脚本、动态样式、操作表格的便捷方法,以及如何高效使用NodeList。
摘要由CSDN通过智能技术生成

第十四章:DOM

文档对象模型(Document Object Model)是HTML 和 XML文档的编程接口;就是开发者可以通过JavaScript编程,添加、删除、修改页面的各个部分;

14.1 节点层级

任何HTML\XML文档都可以表示为由节点构成的层级结构。

<html>
    <head>
        <title>Sample Page</title>
    </head>
    <body>
        <p>Hello World!</p>
    </body>
</html>

在HTML中,文档元素(document)每个文档只能拥有一个,而且是最外层元素,其有且只有一个直接子元素<html>

14.1.1 Node类型

DOM Level 1描述了Node的接口,这个接口是所有DOM节点类型都必须实现的

Node接口在JavaScript中被实现为Node类型。

在JavaScript中,所有节点类型都继承Node类型,一共有12种类型并用12个常量表示

(也可以使用其中的数字代替):

  • 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)

节点信息

  • nodeName:存储着节点的名字,如div、img
  • nodeValue:存储着节点的值,若为标签,则值为null
  • nodeType:存储着节点类型,对应着上面的12种类型

节点关系

文档中各节点都具有关系,相当于一个族谱,主要为父元素和子元素两种区别;

  1. childNodes:每个节点都拥有该属性,该属性包含一个NodeList实例,是一个类数组对象有序存储着该节点的所有直接子节点NodeList实例是实时的活动对象,这就意味着,DOM树改变NodeList也会改变,反之亦然;
    • 由于是一个类数组对象,所以可以通过[]访问其中元素;
    • 也可以通过length属性,获取子元素个数。
  2. parentNode:指向父节点
  3. previousSibling:指向前一个兄弟节点,childNodes[0].previousSiblingnull
  4. nextSibling:指向后一个兄弟节点,childNodes[childNodes.length-1].nextSiblingnull
  5. firstChild/lastChild:指向第一个子节点、最后一个子节点
  6. hasChildNodes():返回true,表示有一个或多个节点;
  7. ownerDocument:指向文档中唯一的文档节点(document)。

操纵节点

添加节点:

  1. appendChild():向尾部追加一个节点;接收一个参数:

    • 需要添加的节点
  2. insertBefore():在参照节点前插入一个节点;接收两个参数:

    • 需要添加的节点;
    • 参照节点;

    如果参照节点为null,则效果与appendChild()一样;

  3. replaceChild():替换目标节点;接收两个参数:

    • 要插入的节点
    • 要替换的节点

    被替换的节点,会完全消失在DOM树中。

删除节点:

  1. removeChild():删除一个节点;接收一个参数:

    • 要删除的节点

    会返回被删除的节点

克隆节点:

  1. cloneNode():克隆一个节点,接收一个参数:

    • 布尔值,表示是否深克隆;如果为true,则克隆该节点以及其子节点。

    返回被克隆的节点;如果被克隆的节点没有指定父节点,则称为孤儿节点

    注意,该克隆方法,不会克隆节点的JavaScript属性,如时间处理程序,只复制HTML属性

14.1.2 Document类型

JavaScript中表示文档节点类型。在浏览器中,documentHTMLDocument的实例,表示整个页面

document对象是只读的,一般不会存在诸如appendChild()等方法

Document类型有如下特征:

  • nodeType等于9;
  • nodeName值为"#document";
  • nodeValue值为null;
  • parentNode值为null;
  • ownerDocument值为null;
  • 子节点可以是DocumentType(最多一个) 、 Element(最多一个) 、 ProcessingInstruction或Comment类型。

文档子节点:

document提供了三个访问子节点的快捷方式:

  1. document.documentElement:始终指向<html>元素
  2. document.body:始终指向<body>元素
  3. document.doctype:始终指向<!DOCTYPE>元素

文档信息

document提供了浏览器加载网页的信息

  1. document.title:获取<title>标签的内容,可修改,并会渲染到网页中。
  2. document.URL:获取当前页面的URL
  3. document.domain:获取当前页面的域名
  4. document.referrer:获取当前页面来源

注意:

  • URL和domain是相关的,若URL为https://www.baidu.com/search=xxxx,则域名为www.baidu.com;

  • 后面三个属性中,只有domain是可设置的。处于安全考虑,domain只能设置为URL中的子集

    // 当前URL为:www.p2p.baidu.com
    document.domain = 'p2p.baidu';	// 成功
    document.domain = 'baidu.com';	// 成功
    document.domain = 'hahaha.net';	// 失败
    
  • 当页面包含来自不同子域的窗格(<frame>)或内嵌窗格(<iframe>)时,设置domain是有用的。因为跨源通信存在安全隐患;所以可以把每个页面上的domain都设置为相同的值,就可以访问对方的JavaScript对象

  • domain属性,一旦收紧了,就不能再放松了

    // 当前URL为:www.p2p.baidu.com
    document.domain = 'p2p.baidu.com';	// 放松了,成功
    document.domain = 'baidu.com';		// 继续放松了,成功
    document.domain = 'p2p.baidu.com';	// 再次收紧了,错误!
    

定位元素

document提供了定位元素的方法

  • getElementById():根据id属性获取节点。因为id是唯一的,所以返回第一个找到的。
  • getElementsByClassName():根据class属性获取节点。
  • getElementsByTagName():根据标签名获取节点。
  • getElementsByName():根据name属性获取节点。

除了第一个方法,其余的都是返回一个HTMLCollection对象;该对象也是类数组对象

特殊集合

  • document.anchors包含文档中所有带name属性的<a>元素;
  • document.forms包含文档中所有<form>元素;
  • document.images包含文档中所有<img>元素;
  • document.links包含文档中所有带href属性的<a>元素。

文档写入

  • write():向文档输入信息,接收一个参数:输入内容
  • writeln():上前者一致,只不过会自动添加换行符

注意:

  • 这两个方法需要只能在页面渲染器使用,如果渲染完毕在调用,内容会覆盖整个页面

  • 当使用这个方法动态写入外部资源时,需要注意:

    <html>
    <head>
        <title>document.write() Example</title>
    </head>
    <body>
        <script type="text/javascript">
            document.write("<script type=\"text/javascript\" src=\"file.js\">" +
                "<\/script>");</script>
    </body>
    </html>
    

    在输出内容的第二个script前面,必需加上转义字符,不然会匹配错误;

14.1.3 Element类型

除Document类型外,Element类型就是Web开发中最常用的类型;Elment表示HTML元素,对外暴露访问元素标签名、子节点和属性的能力

Element类型具有以下特征:

  • nodeType等于1;
  • nodeName值为元素的标签名;
  • nodeValue值为null;
  • parentNode值为Document或Element对象;子节点可以是Element、 Text、 Comment、ProcessingInstruction、 CDATASection类型。

特征提取

  • nodeNametagName属性都可以获取Elment元素的标签名,且在HTML中,元素标签名始终以全大写表示

为了防止提取标签名的时候,大小写混乱,推荐如下操作:

if(element.tagName.toLowerCase() == 'div'){
   
    // do something
}

HTML元素

所有HTML元素,都是通过HTMLElement类型标识,包括直接实例和间接实例;

HTMLElement直接继承自Element,并增加了一些标准属性

  • id, 元素在文档中的唯一标识符;
  • title, 包含元素的额外信息, 通常以提示条形式展示;
  • lang, 元素内容的语言代码(很少用) ;
  • dir, 语言的书写方向("ltr"表示从左到右, "rtl"表示从右到左, 同样很少用) ;
  • className, 相当于class属性, 用于指定元素的CSS类(因为class是ECMAScript关键字, 所以不能直接用这个名字)。

可以直接获取、修改这些值:

// <div id='myDiv' class='myClass' title='hello world'>
let div = document.getElementById('myDiv');
console.log(div.class);	// myClass
div.class = 'myLess';
console.log(div.class);	// myLess

修改这些属性会对页面产生影响。

操作属性

每个元素有零个或多个属性,我们可以通过如下三个方法来操作属性:

  • getAttribute():获取属性,接收一个参数:属性名
  • setAttribute():设置属性,接收两个参数:属性名,属性值
  • removeAttribute():移除属性,接收一个参数:属性名

注意:以上说所三种操作属性的方法:

  • 既可以操作标准属性(又称:公认属性)、也可以操作自定义属性;
  • 属性名不区分大小写
  • 在HTML5的规范中,,自定义属性需要加data-为前缀,方便验证;
  • 自定义属性不会称为DOM对象属性,即不会称为公认属性或标准属性;
  • 不仅仅可以获取一般属性,还可以获取事件属性:如onclick;
  • 如果使用getAttribute()来获取事件属性值,则以字符串的形式返回源代码;通常直接访问事件属性:element.onclick,则返回一个函数;
  • 开发者一般使用getAttribute()来访问自定义属性,而公认属性可以直接访问:element.id

attributes属性

attributes属性与childNodes属性类似,也是类似NodeList的实时集合,每个属性表示为Attr节点,保存在NamedNodeMap对象中,其包含如下方法:

  • getNamedItem(name), 返回nodeName属性等于name的节点;
  • removeNamedItem(name), 删除nodeName属性等于name的节点;
  • setNamedItem(node), 向列表中添加node节点, 以其no
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一部分 深入理解DOM脚本编程  第1章 遵循最佳实践    1.1 不唐突和渐进增强    1.2 让JavaScript运行起来     1.2.1 把行为从结构中分离出来     1.2.2 不要版本检测     1.2.3 通过平稳退化保证可访问性     1.2.4 为重用命名空间而进行规划     1.2.5 通过可重用的对象把事情简化     1.2.6 一定要自己动手写代码    1.3 JavaScript语法中常见的陷阱     1.3.1 区分大小写     1.3.2 单引号与双引号      1.3.3 换行     1.3.4 可选的分号和花括号     1.3.5 重载(并非真正的重载)     1.3.6 匿名函数     1.3.7 作用域解析和闭包     1.3.8 迭代对象     1.3.9 函数的调用和引用(不带括号)    1.4 实例:WYSIWYGJavaScript翻转图    1.5 小结   第2章 创建可重用的对象    2.1 对象中包含什么     2.1.1 继承     2.1.2 理解对象成员     2.1.3 window对象中的一切     2.1.4 理解作用域和闭包是根本    2.2 创建你自己的对象     2.2.1 一变多:创建构造函数     2.2.2 添加静态方法     2.2.3 向原型中添加公有方法     2.2.4 公有、私有、特权和静态成员真那么重要吗     2.2.5 对象字面量    2.3 this是什么    2.4 try{}、catch{}和异常处理    2.5 实例:你自己的调试日志     2.5.1 为什么需要JavaScript日志对象     2.5.2 myLogger()对象    2.6 小结   第3章 DOM2核心和DOM2 HTML    3.1 DOM不是JavaScript,它是文档    3.2 DOM的级别     3.2.1 DOM 0 级     3.2.2 DOM 1 级     3.2.3 DOM 2 级     3.2.4 DOM 3 级     3.2.5 哪个级别适合你    3.3 创建示例文档     3.3.1 创建DOM文件     3.3.2 选择一个浏览器   3.4 DOM核心     3.4.1 继承在DOM中的重要性     3.4.2 核心Node对象     3.4.3 核心Element对象     3.4.4 核心Document对象     3.4.5 遍历和迭代DOM树    3.5 DOM HTML     3.5.1 DOM2 HTML 的HTMLDocument对象     3.5.2 DOM2 HTML 的HTMLElement对象    3.6 实例:将手工HTML代码转换为DOM代码     3.6.1 DOM生成工具的HTML文件     3.6.2 使用示例HTML片段进行测试     3.6.3 扩充ADS库     3.6.4 generateDOM对象的框架    3.7 小结   第4章 响应用户操作和事件    4.1 DOM2级事件    4.2 事件的类型     4.2.1 对象事件     4.2.2 鼠标移动事件     4.2.3 鼠标单击事件     4.2.4 键盘事件     4.2.5 表单相关的事件     4.2.6 针对W3C DOM的事件     4.2.7 自定义事件    4.3 控制事件流和注册事件侦听器     4.3.1 事件流     4.3.2 注册事件     4.3.3 在事件侦听器中访问事件对象     4.3.4 跨浏览器的事件属性和方法    4.4 小结   第5章 动态修改样式和层叠样式表    5.1 W3CDOM2样式规范     5.1.1 CSSStyleSheet对象     5.1.2 CSSStyleRule对象     5.1.3 CSSStyleDeclaration对象     5.1.4 支持的匮乏    5.2 当DOM 脚本遇到样式    5.3 把样式置于DOM脚本之外     5.3.1 style属性     5.3.2 基于className切换样式     5.3.3 切换样式表     5.3.4 修改CSS规则    5.4 访问计算样式    5.5 Microsoft的filter属性    5.6 实例:简单的渐变效果    5.7 小结   第6章 案例研究:图像裁剪和缩放工具    6.1 测试文件    6.2 imageEditor对象     6.2.1 调用imageEditor工具     6.2.2 imageEditor载入事件     6.2.3 创建编辑器标记和对象     6.2.4 向imageEditor对象添加事件侦听器     6.2.5 缩放图像     6.2.6 裁剪图像     6.2.7 未完成的图像编辑器    6.3 小结  第二部分 浏览器外部通信  第7章 向应用程序中加入Ajax    7.1 组合的技术     7.1.1 语义化XHTML和DOM     7.1.2 JavaScript和XMLHttpRequest对象     7.1.3 XML     7.1.4 一个可重用的对象     7.1.5 Ajax是正确的选择吗    7.2 为什么Ajax会破坏网站及如何解决     7.2.1 依赖JavaScript生成内容     7.2.2 通过script标签绕过跨站点限制     7.2.3 后退按钮和书签功能     7.2.4 完成请求的赛跑     7.2.5 增加资源占用     7.2.6 问题解决了吗    7.3 实例:Ajax增强的相册    7.4 小结   第8章 案例研究:实现带进度条的异步文件上传功能    8.1 信息载入时的小生命    8.2 起点    8.3 完成整合:上传进度指示器     8.3.1 addProgressBar()对象的结构     8.3.2 载入事件     8.3.3 addProgressBar()对象    8.4 小结  第三部分 部分高级脚本编程资源  第9章 通过库来提高生产力    9.1 选择合适的库    9.2 增强DOM操作能力     9.2.1 连缀语法     9.2.2 通过回调函数进行过滤     9.2.3 操纵DOM文档    9.3 处理事件     9.3.1 注册事件     9.3.2 自定义事件    9.4 访问和操纵样式    9.5 通信    9.6 小结   第10章 添加效果增强用户体验    10.1 自己动手实现效果     10.1.1 让我看到内容     10.1.2 提供反馈    10.2 几个视觉效果库简介    10.3 视觉盛宴     10.3.1 MOO式的CSS属性修改     10.3.2 通过Script.aculo.us实现视觉效果     10.3.3 通过Moo.fx实现逼真的运动效果     10.3.4 圆角效果     10.3.5 其他库    10.4 行为增强    10.5 小结   第11章 丰富的Mashup!运用API添加地图、搜索及更多功能    11.1 API密钥    11.2 客户端API:离不开JavaScript     11.2.1 地图中的Mashup应用     11.2.2 Ajax搜索请求     11.2.3 地图与搜索的Mashup应用    11.3 服务器端API:需要代理脚本     11.3.1 通过Basecamp构建集成的To-Do列表     11.3.2 通过Flickr取得个性头像    11.4 小结   第12章 案例研究:用DOM设计选择列表    12.1 经典的感觉    12.2 构建更好的选择列表    12.3 策略?我们不需要臭哄哄的策略     12.3.1 相关的文件     12.3.2 FauxSelect对象     12.3.3 开始创建人造select元素     12.3.4 查找select元素     12.3.5 构建DOM元素    12.4 添加事件——为人造select赋予生命    12.5 让表单绽放光彩    12.6 行为修正     12.6.1 z-index来救急     12.6.2 键盘控制及其他细节     12.6.3 select太大了吗    12.7 最后的细节    12.8 继续替换select的冒险    12.9 小结
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值