1 DOM 变化
| DOM 规范 | 主要内容 |
|---|---|
| DOM1 | 主要定义的是 HTML 和 XML 文档的底层结构。 |
| DOM2 和 DOM3 | 在 DOM1 的基础上引入了更多的交互能力,也支持了更高级的 XML 特性。 |
DOM 变化
| DOM 2 模块 | 说明 |
|---|---|
| core | 在 DOM1 的基础上构建,为节点添加了更多属性与方法。 |
| views | 为文档定义了基于央视信息的不同视图。 |
| events | 说明了如何使用时间与 DOM 文档交互。 |
| style | 定义了如何以编程方式来访问和改变 CSS 样式信息。 |
| Traversal and Range | 引入了遍历 DOM 文档和选择其特定部分的新接口。 |
| HTML | 在 DOM1 的基础上,添加了更多属性、方法和新接口。 |
| DOM 3 模块 | 说明 |
|---|---|
| XPath | 见18 |
| Load and Save | 见18 |
检测浏览器对 DOM 的支持情况
1 | // DOM 2 模块检测 |
1.1 针对 XML 命名空间的变化
XML 也有命名空间?
是的,命名空间使得不同的 XML 文档的元素可以混合在一起,共同构成格式良好的文档,而不发生明明冲突。
HTML 有命名空间吗?
严格说来, HTML 不支持 XML 命名空间,但 XHTML 支持。
如何在 XHTML 中指定命名空间?
1 | <html xmlns[:可选前缀]="文档说明地址"> |
前缀有啥用?
如果为命名空间定义了一个名为 x 的前缀,则所有 XHTML 的元素都以需要以 x 前缀开头。
1 | <x:html xmlns:x="http://www.w3.org/1999/xhtml"> |
指定命名空间有啥用?
在只基于一种语言编写 XML 文档的情况下,命名空间实际上也没有什么用。不过,在混合使用两种语言的情况下,命名空间的用处就非常大了。
例如:混合 XHTML 和 SVG 语言
1 | <html xmlns="httpdea://www.w3.org/1999/xhtml"> |
多个命名空间的问题?
1 | 在混合和其它非 `XHTML` 语言的 `XHTML ` 中,存在不止一个命名空间,带来的问题就是: |
DOM2 Core 通过大多数 DOM1 级方法提供特定与命名空间的版本解决了这些问题。
Node 类型
| DOM2 Core 提供的特定与命名空间的属性 | 说明 |
|---|---|
| localName | 不带命名空间前缀的节点名称。 |
| namespaceURI | 命名空间 URI 或者(在未指定的情况下是) null。 |
| prefix | 命名空间前缀或者(在未指定的情况下是)null。 |
1 | /* 以前面的 demo 为例 */ |
| DOM3 core 提供的与命名空间有关的办法 | 说明 |
|---|---|
| isDefaultNamespaceURI(prefix) | 在指定的 namespaceURI 是当前节点的默认命名空间的情况下返回 true |
| lookupNamespaceURI(prefix) | 返回给定 prefix 的命名空间 |
| lookupPrefix(namespaceURI) | 返回给定 namespaceURI 的前缀 |
1 | alert(document.body.isDefaultNamespace('http://www.w3.org/1999/xhtml')) // true |
Document 类型
| DOM2 core 提供的与命名空间有关的新方法 | 说明 |
|---|---|
| createElementNS(namespaceURI, tagName) | 使用给定的 tagName 创建一个属于命名空间 namespaceURI 的新元素 |
| createAttributeNS(namespaceURI, attributeName) | 使用给定的 attributeName 创建一个属于命名空间 namespaceURI 的新特性 |
| getElementsByTagNameNS(namespaceURI, tagName) | 返回属于命名空间 namespaceURI 的 tagName 元素的 NodeList。 |
1 | // 创建一个新的 svg 元素 |
Element 类型
| DOM2 core 提供的与命名空间相关的新方法 | 说明 |
|---|---|
| getAttributeNS(namespaceURI, localName) | 取得属于命名空间 namespaceURI 且名为 localName 的特性 |
| getAttributeNodeNS(namespaceURI, tagName) | 返回属于命名空间 namespaceURI 的 tagName 元素的 NodeList。 |
| hasAttributeNS(namespaceURI, localName) | 确定当前元素是否有一个名为 localName 的特性,而且该特性的命名空间是 namespaceURI。 |
| hasAttribute(attrName) | 同上,当不区分命名空间。 |
| removeAttributeNS(namespaceURI, localName) | 删除属于命名空间 namespaceURI 且名为 localName 的特性。 |
| setAttributeNS(namespaceURI, qualifiedName, value) | 设置属于命名空间 namespaceURI 且名为 qualifiedName 的特性的值为 value。 |
| setAttributeNodeNS(attNode) | 设置属于命名空间 namespaceURI 的特性节点 |
NamedNodeMap 类型
| DOM2 core 提供的与命名空间相关新方法 | 说明 |
|---|---|
| getNamedItemNS(namespaceURI, localName) | 取出命名空间 namespaceURI 且名为 localName 的项。 |
| removeNamedItemNS(namespaceURI, localName) | 移除属于命名空间 namespaceURI 且名为 localName 的项。 |
setNamedItemNS(node):添加 node,这个节点已经实现制定了命名空间信息。
1.2 其它方面的变化
DOM2 Core 对 DOM 的其他部分的变化,和 XML 无关,而是更倾向于确保 API 的可靠性及完整性。
DocumentType 类型
DOM2 Core
| 新增成员 | 说明 |
| ————– | ————— |
| publicId | 文档类型声明信息段之一 |
| systemId | 文档类型声明信息段之一 |
| internalSubset | 包含在文档类型声明中的额外定义 |
1 |
|
1 | document.doctype.publicId // '-//W3C//DTD HTML 4.01//EN' |
Document 类型
DOM2 Core
| 新增成员 | 说明 |
| ——————— | —————————————- |
| document.importNode() | 从一个文档中取得一个节点,探究将导入到另一个文档,时期成为这个文档结构的一部分。 |
| document.defaultView | 指向拥有给定文档的窗口(或框架) |
importNode()
DOM2 Core
☑︎ 说明:每个节点都有一个 ownerDocument 属性,表示所属的文档。如果调用 appendChild() 时传入的节点属于不同的文档会导致报错。而 importNode() 会返回一个新节点,这个节点的 ownerDocument 是当前文档,因此不会报错。
| 参数 | 类型 | 说明 |
|---|---|---|
| 1 | HTMLElement | 要复制的节点 |
| 2 | Boolean | 是否复制子节点 |
☑︎ 返回值:原节点的副本,但能够在当前文档中使用。
1 | var newNode = document.importNode(oldValue, true) // 导入节点及其所有子节点 |
document.defaultView
☑︎ 兼容性:IE 之外的所有浏览器
扩展
在 IE 中有一个等价的属性 document.parentWindow,因此,要确定文档的归属窗口,可以使用以下代码。
1 | var parentWindow = document.defaultView || document.parentWindow |
document.implementation.createDocumentType()
DOM2 Core
☑︎ 功能:创建一个新的 DocumentType 节点
参数|说明
——|—|—
1|文档类型名称
2|publicId
3|systemId
☑︎ 用途:由于即有文档类型不能改变,因此 createDocumentType() 只能在创建新文档时有用
1 | // 创建一个新的 HTML 4.01 Strict 文档类型 |
document.implementation.createDocument()
DOM2 Core
☑︎ 功能:创建新文档
| 参数 | 说明 |
|---|---|
| 1 | 针对文档中元素的 namespaceURI |
| 2 | 文档元素的标签名 |
| 3 | 新文档的文档类型 |
1 | // 创建一个没有命名空间的新 XML 文档,文档元素为 <root> ,而且没有指定文档类型 |
1 | var doctype = document.implementation.createDocumentType('html', |
document.implementation.createHTMLDocument()
DOM2 HTML
☑︎ 功能:创建一个完整的 HTML 文档。
☑︎ 参数:创建文档的标题(放在 <title> 元素中的字符串)
☑︎ 返回:新的 HTML 文档(HTMLDocument 实例,因而具有所有该类型的所有属性和方法,包括 title 和 body 属性)
☑︎ 兼容性:Safari Opera Chrome
1 | var htmlDoc = document.implementation.createHTMLDocument('New Doc') |
Node 类型
document.body.isSupported()
DOM2
☑ ︎说明:类似 Dom1 的document.implementation.hasFeature(),用于确定当前节点具有什么能力。
| 参数 | 说明 |
| —- | —– |
| 1 | 特性名 |
| 2 | 特性版本号 |
☑ 返回:true 如果浏览器实现了相应特性,false 没有实现该特性。
☑ 注意:由于不同实现在决定什么特性返回 true 或 false 时并不一致,这个方法同样也存在于 hasFeature() 方法相同的问题。为此,在确定某个特性是否可用时,最好还是使用能力检测。
1 | if (document.body.isSupported('HTML', '2.0')) { |
element.isSameNode()
☑ 用途:比较是否引用同一个节点。
☑ 参数:节点对象。
☑ 返回:true 引用同一个节点,false 不是同一个节点
1 | var div1 = document.createElement('div') |
element.isEqualNode()
☑ 用途:判断两个节点是否相同。
1 | ☑ 节点类型相同; |
☑ 参数:节点对象。
1 | var div1 = document.createElement('div') |
☑ 返回:true 引用同一个节点,false 不是同一个节点
element.setUserData()
DOM3
☑ 说明:将数据指定给节点。
| 参数 | 类型 | 说明 |
|---|---|---|
| 1 | string | 要设置的键 |
| 2 | any | 实际的数据 |
| 3 | 处理函数, 会在节点被复制、删除、重命名活着引入一个文档是调用。 |
| 处理函数(参数3)接受5个参数 | 说明 |
|---|---|
| 1 | 表示操作类型的数值(1 复制, 2 导入, 3 删除, 4 重命名) |
| 2 | 数据键 |
| 3 | 数据值 |
| 4 | 源节点(删除节点时为 null) |
| 5 | 目标节点(复制节点时为 null) |
1 | document.body.setUserData('name', 'Nichoalas', function () {}) |
element.getUserData()
☑ 参数:键
☑ 返回:键对应的值。
1 | var div = document.createElement('div') |
框架
框架有两种
☑ 框架: HTMLFrameElement
☑ 内嵌框架:HTMLIFrameElement
iframe.contentDocument
☑ 类型:Document
☑ 说明:因为该属性是 Document 类型的实例,因此可以像使用其他 HTML 文档一样使用它,包括所有属性和方法。
☑ 限制:该属性的访问收到跨源泉策略的限制。如果某个框架中的页面来自其他域活着不同子域,那么妖访问这个框架中的文档对象就会导致错误。
☑ 兼容性:Opera Firefox Safari Chrome IE8+
扩展
IE8 之前不支持框架中的 contentDocument 属性,但有一个名叫 contentWindow 的属性,该属性返回框架的 window 对象,因此可以通过 window.document 来替代 contentWindow。
因此,兼容性更好的用法如下:
1 | var iframe = document.getElementById('myIframe') |
2 样式
在 HTML 中定义样式的 3 种方式:
- 通过
<link/>元素包含外部样式表文件; - 使用
<style/>元素定义嵌入式样式; - 使用
style特性定义针对特定元素的样式。
1 | // 浏览器是否支持 DOM2 css 对 css 的支持 |
2.1 访问元素的样式
element.style
DOM2 css
☑ 说明:包含通过 HTML 的 style 特性指定的所有样式相关信息。
☑ 类型:CSSStyleDeclaration
☑ 注意:但不包含与外部样式表或嵌入样式表层叠而来的样式。
element.style.[css样式名]
☑ 读:在 style 特性中指定的所有样式。
1 | ☑ 对于使用'-'分割的 CSS 属性名,必须将其转换成驼峰大小写形式。 |
☑ 写:标准模式下所有度量值都必须指定一个度量单位(推荐),否则样式不会生效;混杂模式下有些单位可以省略。
☑ 注意:如果没有为元素设置 style 特性,那么style对象中可能会包含一些默认的值,但这些值并不能准确地反映该元素的样式信息。
1 | <div id="myDiv" style="background-color: blue; width: 10px; height: 25px"></div> |
1 | var myDiv = document.getElementById('myDiv') |
element.style.[属性和方法]
☑ 兼容性:IE9+ Firefox Safari Opera9+ Chrome
| 属性或方法 | 说明 |
|---|---|
| cssText | 如前所述,通过它能够访问到 style 特性中的 css 代码。 |
| length | 应用给元素的 css 属性的数量。 |
| parentRule | 表示 css 信息的 CSSRule 对象。 |
| getPropertyCSSValue(propertyName) | 返回包给定属性值的 CSSValue 对象。 |
| getPropertyPriority(propertyName) | 如果给定的属性使用了!important设置,则返回 important; 否则,返回空字符串。 |
| getPropertyValue(propertyName) | 返回给定属性的字符串值。 |
| item(index) | 返回给定位置的 css 属性的名称。 |
| removeProperty(propertyName) | 从样式中删除给定属性。 |
| setProperty(propertyName, value, priority) | 将给定属性设置为相应的值,并加上优先权标志(important 或者一个空字符串)。 |
element.style.cssText
☑ 读:返回浏览器对 style 特性中 css 代码的内部表示。
☑ 写:赋给 cssText 的值回重写整个 style 特性的值,以前通过 style 特性指定的样式信息都将丢失。
1 | myDiv.style.cssText = 'width: 25px; height: 100px; background-color: green' |
element.style.length
☑ 用途:与 item() 方法配套使用,以便迭代在元素中定义的 css 属性。
1 | for (var i = 0, len = myDiv.style.length; i < len; i++) { |
element.style[index]
☑ 用途:替代 element.style.item()
1 | var prop, value, i, len |
getPropertyCSSValue
☑ 参数:属性名.
☑ 返回:包含另个属性的一个对象。
☑ 兼容性: IE9+ Safari3+ Chrome
- cssText: 与
getPropertyValye()返回的值相同; - cssValueType: 一个数值常量,表示值的类型
| cssValueType | 代表 |
|---|---|
| 0 | 继承的值 |
| 1 | 基本的值 |
| 2 | 值列表 |
| 3 | 自定义的值 |
1 | var prop, value, i, len |
removeProperty(property)
☑ 功能:使用这个方法移除一个属性,意味着将会为该属性应用默认的样式(从其它样式表经层叠而来)。
☑ 用途:在不确定某个给丁的 css 属性拥有什么默认值的情况下,就可以使用这个方法。只要一出相应的属性,就可以为元素应用默认值。
计算的样式
DOM2 style
☑ 计算的样式都是只读的,不能修改计算后样式对象中的 css 属性。
☑ 计算后的样式也包含属于浏览器内部样式表的样式信息,因此任何具有默认值的 css 属性都会表现在计算后的样式中。
document.defaultView.getComputedStyle()
☑ 功能:获取指定元素的所有 css 样式信息,包括哪些从其他样式表层叠而来并影响到当前元素的样式信息。
| 参数 | 说明 |
|---|---|
| 1 | 要取得计算样式的元素 |
| 2 | 一个为元素字符串(比如 ‘:after’,设置为 null 则不区分状态,返回所有) |
☑ 返回:一个 CSSStyleDeclaration 对象(与 style 属性的类型相同),其中包含当前元素的所有计算的样式。
☑ 限制
- 浏览器在处理综合属性(比如 border)的方式不同,不会所有浏览器都有返回值。
☑ 兼容性:Firefox chrome Safari Opera
- IE 不支持,但有个
element.style.currentStyle属性(CSSStyleDeclaration的实例),包含当前元素全部计算后的样式。 - Firefox 和 Safari 会将所有颜色转换成 RGB 格式。
☑ 建议:不要试图获取综合属性。
1 |
|
1 | var myDiv = document.getElementById('myDiv') |
2.2 操作样式表
CSSStyleSheet 类型
☑ 说明:除了 CSSStyleSheet ,还有两种类型的对象可以操作样式表
- HTMLLinkElement 类型对象 (
<link>元素包含的样式表); - HTMLStyleElement 类型对象(
<style>元素中定义的样式表)。
CSSStyleSheet 类型相对更加通用一些,它只表示样式表,而不管这些样式表在 HTML 中是如何定义的。上述两个针对元素的类型允许修改 HTML 特性,但 CSSStyleSheet 对象则是一套只读的接口(有一个属性例外)。
☑ 父类:StyleSheet
| 继承自 StyleSheet 的接口 | 读写 | 说明 |
|---|---|---|
| disabled | 读/写 | 表示样式表是否被禁用的布尔值。将这个值设置为 true 可以禁用样式表。 |
| href | 读 | 如果样式表是通过 link 标签包含的,则是样式表的 URL;否则,是 null。 |
| media | 读 | 当前样式表支持的所有媒体类型的集合。 |
| ownerNode | 读 | 指向拥有当前样式表的节点的指针。 |