第12章 DOM2和DOM3
DOM1级主要定义的是HTML和XML文档的底层结构。
DOM2和DOM3则在这个结构的基础上引入了更多的交互能力,也支持了更高级的XML特性。因为,DOM2和DOM3级分为许多模块,分别描述了DOM的某个非常具体的子集:
◆ DOM2级核心:在1级基础上构建,为节点添加了更多方法和属性
◆ DOM2级视图:为文档定义了基于样式信息的不同视图
◆ DOM2级事件:说明了如何使用事件与DOM文档交互。
◆ DOM2级遍历和范围:引入了遍历DOM文档和选择其特定部分的新接口
12.1 DOM变化
DOM2级核心没有引入新类型,它只是在DOM1级的基础上通过增加新方法和新属性来增强了既有类型。
DOM3级核心同样增强了既有类型,但也引入了一些新类型。
12.1.1 针对XML命名空间的变化
有了XML命名空间,不同XML文档的元素就可以混合在一起,共同构成格式良好的文档,而不必担心发生命名冲突
【命名冲突:在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。】
从技术上来说,HTML不支持XML命名空间,但是XHTML支持XML命名空间。
命名空间要使用xmlns特性来制定。 XHTML的命名空间是http://www.w3.org/1999/xhtml,在任何格式良好XHTML页面中,都应该将其包含在<html>元素中
<html xmlns="http://www.w3.org/1999/xhtml">
//这样子,文档中包含的所有元素默认都视为XHTML命名空间的元素。
要想明确的为XML命名空间创建前缀,可以使用xmlns后跟冒号,再跟前缀:
<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xhtml:head>
<xhtml:title>Example XHTML page</xhtml:title>
<xhtml:/head>
<xhtml:body>
Hello world
</xhtm:/body>
</xhtml:html>
有时候为了避免不同语言间的冲突,也需要使用命名空间来限定特性。
<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xhtml:head>
<xhtml:title>Example XHTML page</xhtml:title>
<xhtml:/head>
<xhtml:body xhtml:class="home">//特性class带有一个xhtml前缀
Hello world
</xhtm:/body>
</xhtml:html>
在只基于一种语言编写XML文档的情况下,命名空间实际上也没有什么用。不过,在混合使用两种语言的情况下,命名空间的用处就非常大了。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<time>Example XHTML page</time>
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
viewBox="0 0 100 100" style="width:100%;height:100%">
<rect x="0" width="100" height="100" style="fill:red"/>
</svg>
</body>
</html>
设置命名空间,将<svg >标识为了与包含文档无关的元素
此时,<svg >元素的所有子元素,以及这些元素的所有特性,都被认为属于http://www.w3.org/1999/xhtml命名空间。即使这个文档从技术上说是一个XHTML文档,但因为有了命名空间,其中的SVG代码也仍然是有效的。
"DOM2级核心"通过为大多数DOM1级方法提供特定于命名空间的版本,解决了元素属于哪个命名空间,或者在查询特殊标签名的时候,应该将结果包含在哪个命名空间中的问题
1、Node类型的变化
在DOM2级中,Node类型包含系列特定于命名空间的属性:
◆ localName:不带命名空间前缀的节点名称
◆ namespaceURI:命名空间URI或者(在未指定的 情况下是)null
◆ prefix:命名空间前缀或者(在未指定的情况下是)null
DOM3级在此基础上更近一步,又引入了下列与命名空间有关的方法:
◆ isDefaultNamespace(namespaceURI):在指定的namespaceURI是当前节点的默认命名空间的情况下返回true
◆ lookupNamespaceURI(prefix):返回给定prefix的命名空间
◆ lookupPrefix(namespaceURI):返回给定namespaceURI的前缀
2、Document类型的变化:
DOM2级中的Document类型也发生了变化,包含以下与命名空间有关的方法:
◆ createElementNS(namespaceURI,tagName):使用给定的tagName创建一个属于命名空间namespaceURI的新元素
◆ createAttributeNS(namespaceURI,attributeName):使用给定的attributeName创建一个属于命名空间的namespaceURI的新特性
◆ getElementsByTagNameNS(namespaceURI,tagName):返回属于命名空间namespaceURI的tagName元素的NodeList。
使用这些方法时需要传入表示命名空间的URI(而不是命名空间前缀):
//创建一个新的SVG元素
var svg = document.createElementNS("http://www.w3.org/2000/svg","svg");
//创建一个属于某个命名空间的 新特性
var att = document.createAttributeNS("http://www.somewhere.com","random");
//取得所有XHTML元素
var elems = document.getElementsByTagNameNS("http://www.w3.org/1999/xhtml","*");
只有在文档中存在两个或多个命名空间时,这些与命名空间有关的方法才是必须的。
3、Element类型的变化:
“DOM2级核心”中有关Element的变化,主要涉及操作特性
◆ getAttributeNS(namespaceURI,localName):取得属于命名空间namespaceURI且名为localName的特性
◆ getAttributeNodeNS(namespaceURI,localName):取得属于命名空间namespaceURI且名为localName的特性节点
◆ getElementsByTagNameNS(namespaceURI,tagName):返回属于命名空间namespaceURI的tagName元素的NodeList
◆ hasAttributeNS(namespaceURI,localName):确定当前元素是否有一个名为localName的特性,而且该特性的命名空间是namespaceURI。
注意,“DOM2级核心”也增加了一个hasAttribute()方法,用于不考虑命名空间的情况
◆ removeAttributeNS(namespaceURI,localName):删除属于命名空间namespaceURI且名为localName的特性
◆ setAttributeNS(namespaceURI,qualifiedName,value):设置属于命名空间namespaceURI且名为qualifiedName的特性的值为value
◆ setAttributeNodeNS(attNode):设置属于命名空间的namespaceURI的特性节点
4、NamedNodeMap类型的变化
NamedNodeMap类型也新增了与命名有关的方法,由于特性时通过NameNodeMap表示的,因此这些方法多数情况下只针对特性使用
◆ getNamedItemNS(namespaceURI,localName):取得属于命名空间namespaceURI且名为localName的项
◆ removeNamedItemNS(namespaceURI,localName):移除属于命名空间namespaceURI且名为localName的项
◆ setNamedItemNS(node):添加node
网友评论