JavaScript高级程序设计-第三版(DOM)

十、DOM

       针对HTML和XML文档的一个API,javascript对其实现。

10.1 节点层次

10.1.1 Node类型

  • DOM1 级定义了一个Node接口,所有节点类型都实现该接口
  • 每个节点类型都有nodeType属性
           并不是所有节点类型都支持
    • Node.ELEMENT_NODE——1
    • Node.ATTRIBBUTE_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
10.1.1.1 nodeName和nodeValue属性
  • 属性值取决于节点类型
    • 元素节点的nodeName为标签名,nodeValue为null
10.1.1.2 节点关系
  • childNodes
           保存NodeList对象,有序的,不是Array的实例,动态的
    • 两种访问方式
      • 方括号 childNodes[index]
      • item()方法 childNodes.item(index)
    • length属性
    • 使用Array.prototype.slice(someNode.childNodes,0)可以将NodeList对象转化为数组
    • 包含在childNodes列表中的所有节点都具有相同的父节点
  • parentNode
  • previousSibling和nextSibling
           子节点列表中的上一个和下一个节点
  • firstChild和lastChild
  • hasChildNodes()
  • ownerDocument
           指向最顶端的文档节点
10.1.1.3 操纵节点
  • appendChild(newNode)
           将新节点插入子节点列表的最后位置
  • insertBefore(newNode, accordingNode)
           将新节点插入某个节点之前
  • replaceChild(newNode, initialNode)
  • removeChild(initialNode)
10.1.1.4 其他方法
  • cloneNode(bool)
    • true
             深复制,包括子节点树、特性
    • false
             浅复制
  • normalize()
           将子节点的空文本节点删除或合并两个相邻的文本节点。

10.1.2 Document类型

  • Document类型表示整个文档
  • document对象是window对象的一个属性
  • Document节点的特征
    • 子节点可能是一个documentType(最多一个)、element(最多一个)、processingInstruction或Comment
10.1.2.1 document子节点
  • 指向<html>元素
    • document.documentElement
  • 指向<body>元素
    • document.body
  • 指向<!DOCTYPE>元素
    • document.doctype
  • Document类型是只读的,在document上调用appendChild()等方法操纵节点不起作用且不需要,因为只能有一个元素节点且一般都已存在
10.1.2.2 文档信息
  • document.title
           指向<title>元素
  • 网页请求
           HTTP请求头中的信息
    • document.URL
    • document.domain
             域名
      • 不同子域之间不能通讯
      • www.wrox.com和其内嵌框架的页面为p2p.wrox.com,可以将domain设置为wrox.com,则可以相互通信
      • 设置为wrox.com(松散)之后就无法再修改为p2p.wrox.com(紧绷)
    • document.referrer
             来源页面
10.1.2.3 查找元素
  • getElementById()
  • getElementsByTagName()
    • 返回值为HTMLCollection实例
      • item()
      • namedItem()
      • 方括号
        • number 内部调用item()
        • string 内部调用namedItem()
    • 返回所有元素 getElementsByTagName(" * ")
  • getElementsByName()
10.1.2.4 特殊集合

       HTMLCollection对象

  • document.anchors 所有带name特性的<a>元素
  • document.applets
  • document.forms
  • document.images
  • document.links 所有带href特性的<a>元素
10.1.2.5 DOM一致性检测

       检测浏览器对于DOM的实现

  • document.implementation属性
    • hasFeature(string feature, string version)
             浏览器支持给定名称和版本的功能,则返回true。
      • 浏览器可能在没有实现某些功能的情况下返回true,最好同时进行能力检测
10.1.2.6 文档写入
  • document.write() 和document.writeln()
    • 字符串中的html标记也将被正确解析为html
    • 在页面加载过程中写入则是添加
    • 在页面加载完毕后写入则是重写页面,window.onload
<html>
	<head>
		<script>
			window.onload=function(){
				document.write("<p>重写页面</p>");
			}
		</script>
	</head>
	<body>
		<p>test</p>
		<script>
			document.write("<p>添加内容</p>");
		</script>
	</body>
</html>
  • document.open()和document.close()
    • 打开和关闭网页输出流

10.1.3 Element类型

  • tagName和nodeName
           HTML中以全部大写表示,XML中与源码一致
10.1.3.1 HTML元素
  • 每个HTML元素都存在的标准特性
    • id
    • title
    • lang
    • dir
             语言的方向,ltr 为从左到右
    • className
10.1.3.2 取得特性
  • getAttribute(name)
    • 接收的特性名称参数不区分大小写
    • 返回字符串表示的特性值
    • 任何元素的公认特性会以属性的形式添加到DOM对象中,可以不调用getAttribute()方法直接获得特性值
      • div.id
    • style和onclick等,用特性获取到的是相应的字符串表示,而用属性则获取到的是对象
10.1.3.3 设置特性
  • setAttribute(name, value)
    • 若特性名称不存在,则创建它
    • 也可以通过给DOM对象的相应属性赋值的方式设置特性值
  • removeAttribute(name)
10.1.3.4 attributes属性

       返回一个NamedNodeMap对象,元素的每一个特性都由一个节点表示。主要用于遍历元素特性

  • getNamedItem(name)
  • removeNamedItem(name)
  • setNamedItem(node)
  • item(pos)
  • specified
           如果对元素的某个特性进行了设置,则返回true
10.1.3.5 创建元素
  • document.createElement(tagName)
           只创建元素,未将元素添加进文档树中
10.1.3.6 元素子节点
  • 元素也支持getElementsByTagName() 方法,但只返回当前元素的后代

10.1.4 Text类型

  • 访问文本
    • nodeValuedata
  • 修改文本
           会对输入文本进行HTML编码,默认一个元素只有一个文本节点。
    • appendData(text)
    • deleteData(offset, count)
    • insertData(offset, text)
    • replaceData(offset, count, text)
    • splitText(offset)
             按指定位置将文本节点分割为两个文本节点,该方法返回一个新文本节点。0~offset为原文本节点
    • substringData(offset, count)
  • 文本长度
    • 文本节点的length属性
    • nodeValue及data的length属性
  • 默认情况下,每个可以包含内容的元素最多只能有一个文本节点,且必须确实有内容存在
10.1.4.1 创建文本节点
  • document.createTextNode(text)
    • 多次调用可以创建多个文本节点并添加到父节点中,这种情况只出现在DOM操作中
10.1.4.2 规范化文本节点
  • element.normalize()
10.1.4.3 分割文本节点
  • element.splitText(offset)

10.1.5 Comment类型

  • 注释节点,与文本节点类似,除了没有与splitText()对应的方法之外
    没有子节点
  • 注释节点必须是<html>元素的后代才能保证访问得到
  • document.createComment()

10.1.6 CDATASection类型

  • 只针对XML文档,表示CDATA(Unparsed Character Data)区域,类似文本节点,除了没有与splitText()对应的方法之外

10.1.7 DocumentType类型

  • 不能动态创建,只能通过解析文档代码的方式创建
  • name
           文档类型的名称,例如HTML或XML
  • entities
           HTML下为空的NamedNodeMap对象
  • notations
           HTML下为空的NamedNodeMap对象

10.1.8 DocumentFragment类型

  • 在文档中没有对应的标记
  • 父节点为null
  • 可作为仓库使用,在里面保存可能会添加到文档中的节点
  • document.createDocumentFragment()
  • 用于一次性添加多个节点,避免多次渲染

10.1.9 Attr类型

  • 存在于元素的attributes属性中的节点
  • 父节点为null
  • 不是DOM文档树中的一部分
  • name
  • value
  • specified
    • bool值,表示特性是否设置
  • document.createAttribute()

10.2 DOM操作技术

10.2.1 动态脚本

       通过DOM操作添加<script>元素插入javascript代码

  • 外部代码
    • 元素的src属性指定外部文件
    • 添加进DOM文档树后才会执行代码
  • 内部代码
    • 添加文本节点的方式设置内部代码
    • 元素的text属性设置内部代码
    • 类似eval()

10.2.2 动态样式

通过DOM操作嵌入CSS样式

  • 外部样式
    • 通过<link>元素引入样式文件
      • rel stylesheet
      • type text/css
      • href
  • 内部样式
    • 添加文本节点的方式设置内部样式代码
    • 元素的styleSheet属性的cssText属性设置内部样式

10.2.3 操作表格

  • <table>
    • caption
             表格标题
    • tBodies
    • tFoot
    • tHead
    • rows
    • createTHead()
    • createTFoot()
    • createCaption()
    • deleteTHead()
    • deleteTFoot()
    • deleteCaption()
    • deleteRow(pos)
    • insertRow(pos)
  • <tbody>
    • deleteRow(pos)
    • insertRow(pos)
  • <tr>
    • cells
    • deleteCell(pos)
    • insertCell(pos)

10.2.4 使用NodeList

  • 遍历NodeList、NamedNodeMap和HTMLCollection
    • 都是动态的
    • 在循环中进行改变NodeList长度的操作会造成无限循环
    • 用第二个变量将length的值获取并固定下来可以避免死循环
  • 每次访问NodeList都会运行一次基于文档的查询
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《JavaScript高级程序设计》(第三版)是一本经典的JavaScript技术书籍。此书由Nicholas C. Zakas撰写,涵盖了广泛的主题,适合有一定JavaScript基础的读者。本书详细介绍了JavaScript语言的各个方面,包括基本语法、DOM操作、BOM操作、事件处理、Ajax、浏览器兼容性问题等。 这本书的优点之一是作者对JavaScript的深刻理解和独特的教学方法。他将复杂的概念和技术变得简单易懂,通过实际的例子和案例来解释和演示。读者可以通过跟随书中的练习和项目,逐渐提升自己的JavaScript编程能力。 此外,本书还包含了一些高级主题,如函数、闭包、面向对象编程等。这些主题对于想要深入理解JavaScript的读者来说十分有价值。此外,作者还介绍了一些最佳实践和优化技巧,帮助读者编写更高效、可维护的JavaScript代码。 《JavaScript高级程序设计》(第三版)最大的优点之一是其综合性。它涵盖了JavaScript的各个方面,并且通过详细的目录、索引和附录,方便读者在需要时进行查找和参考。此外,书中还有大量的实例代码和详细的解释,使得读者能够更好地理解和应用所学的知识。 总结来说,《JavaScript高级程序设计》(第三版)是一本非常全面、详尽的JavaScript技术书籍。它不仅适合有一定基础的读者,也适合那些想要深入了解JavaScript编程的人。无论是作为学习教材还是作为参考书,这本书都是非常有价值的。阅读本书将有助于读者提升自己的JavaScript编程能力,并掌握一些高级技术和最佳实践。 ### 回答2: 《JavaScript高级程序设计(第三版)》是一本经典的JavaScript编程指南,由著名的JavaScript专家尼古拉斯·泽卡斯(Nicholas C. Zakas)撰写。该书自2009年首次出版以来,一直被广泛用作学习JavaScript的参考书籍。 这本书从基础知识讲起,逐渐引导读者深入了解JavaScript的各个方面。作者详细介绍了JavaScript的语法、数据类型、运算符、函数、对象、数组等核心概念,并通过大量的实例和案例进行讲解,帮助读者理解和应用这些知识。 《JavaScript高级程序设计(第三版)》特别关注JavaScript高级特性和最佳实践。作者深入浅出地讲解了闭包、原型链、作用域链等概念,并详细探讨了JavaScript的错误处理、异步编程和模块化等重要主题。读者通过学习这些内容,可以编写出更加高效、可维护和可扩展的JavaScript代码。 此外,书中还介绍了如何在浏览器环境和服务器环境中使用JavaScript,包括DOM操作、事件处理、Ajax、Web存储等技术。作者还对跨浏览器兼容性进行了讨论,帮助读者解决在不同浏览器中遇到的兼容性问题。 总之,《JavaScript高级程序设计(第三版)》是一本非常全面和权威的JavaScript学习资料。它适合初学者学习JavaScript的基础知识,也适合有一定经验的开发者深入了解和掌握JavaScript高级特性。无论是前端开发还是后端开发,读者都能从中获得宝贵的经验和知识。 ### 回答3: 《JavaScript高级程序设计》(第三版)是一本经典的JavaScript编程教材。该书由Nicholas C. Zakas撰写,对JavaScript的核心概念和高级技术进行了深入讲解。 该书主要分为三个部分。第一部分介绍了JavaScript语言的基础知识,包括语法、数据类型、流程控制、函数等内容。这一部分的目的是帮助读者建立对JavaScript基础的扎实理解,为后续的高级概念打下基础。 第二部分是该书的核心内容,讨论了JavaScript的面向对象编程和浏览器环境中的DOM操作。读者将学习使用构造函数、原型和继承等概念来开发复杂的JavaScript应用程序。此外,本书还给出了大量的示例代码和实践项目,帮助读者提升编程实战能力。 第三部分则涵盖了一些高级主题,如错误处理、数据存储、正则表达式、Ajax等。这些议题是现代Web开发中非常重要的部分,对于提升网页交互性和用户体验至关重要。 《JavaScript高级程序设计》(第三版)在内容上更为详尽全面,适合具备一定JavaScript基础的读者学习。此外,该书侧重于实践应用,深入浅出地讲解了一些复杂的概念,并通过实例和项目帮助读者学以致用。 总的来说,该书通过系统性的介绍和练习,帮助读者逐步掌握JavaScript的核心概念和高级技术,为他们成为出色的JavaScript开发者奠定坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值