JavaScript DOM2和DOM3——“DOM的变化”的注意要点 - 前端学习笔记
DOM2和DOM3级分为许多模块,分别描述了DOM的某个非常具体的子集。这些模块主要有核心(Core)、视图(Views)、事件(Events)、样式(Style)、遍历和范围(Traversal and Range)以及HTML。
另外,DOM2和3级的目的在于扩展DOM API,由于DOM2级视图和DOM2级HTML两个模块很小,因此我们将他们与“DOM2级核心”放在一起。
针对XML命名空间的变化
有了XML命名空间,不同XML文档的元素就可以混合在一起;从技术上说,HTML不支持XML混合命名空间,但XHTML支持XML命名空间。
命名空间要使用xmlns特性来指定,都应该包含在html元素中如:
<html xmlns="http://www.w3.org/1999.xhtml"><head> <meta charset="UTF-8"> <title>Document</title></head><body> hello world</body></html>
要想明确地为XML命名空间创建前缀,可以使用xmlns后跟冒号(xmlns:
),再跟前缀如:
<xhtml:html xmlns:xhtml="http://www.w3.org/1999.xhtml"><xhtml:head> <xhtml:meta charset="UTF-8"> <xhtml:title>Document</xhtml:title></xhtml:head><xhtml:body> hello world</xhtml:body></xhtml:html>
为了避免不同语言间的冲突,也许要使用命名空间来限定特性,如:
<xhtml:html xmlns:xhtml="http://www.w3.org/1999.xhtml"><xhtml:head> <xhtml:meta charset="UTF-8"> <xhtml:title>Document</xhtml:title></xhtml:head><xhtml:body xhtml:class="home"> hello world</xhtml:body></xhtml:html>
如混合了XHTML和SVG语言的文档:
<html xmlns="http://www.w3.org/1999/xhtml"><head> <meta charset="UTF-8"> <title>Document</title></head><body> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" ......> <rect x="0" y="0" ...... /> </svg></body></html>
多语言的文档中,调用方法操作文档节点的情况下,难免会存在元素的命名空间从属的问题。“DOM2级核心”通过为大多数DOM1级方法提供特定于命名空间的版本解决了这个问题。
Node类型的变化
在DOM2级中,Node类型包含下列特定于命名空间的属性:
localName:不带命名空间前缀的节点名称;
namespaceURI:命名空间URI或者null;
prefix:命名空间前缀或null;
当节点使用了命名空间前缀时,其nodeName为prefix+“:”+localName
<html xmlns="http://www.w3.org/1999/xhtml"><head> <meta charset="UTF-8"> <title>Document</title></head><body> <s:svg xmlns:s="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 100 100" style="width:100%; height:100%"> <s:rect x="0" y="0" width="100" height="100" style="fill:red"/> </s:svg></body></html>
对于html元素来说,它的localName和tagName是“html”,namespaceURI是“http://www.w3.org/1999/xhtml”,而prefix是null。
对于svg元素来说,它的localName是“svg”,tagName是“s:svg”,namespaceURI是“http://www.w3.org/2000/svg”,而prefix是“s”。
DOM3级在此基础上更进一步,又引入了下列与命名空间有关的方法:
isDefaultNamespace(namespaceURI):在指定的namespaceURI是当前节点的默认命名空间的情况下返回true;
lookupNamespaceURI(prefix):返回给定prefix的命名空间;
lookupPrefix(namespaceURI):返回给定namespaceURI的前缀;
Document类型的变化
主要有:
createElementNS(namespaceURI,tagName):使用给定的tagName创建一个属于命名空间namespaceURI的新元素;
createAttributeNS(namespaceURI,attributeName):使用给定的attributeName创建一个属于命名空间namespaceURI的新特性;
getElementsByTagNameNS(namespaceURI,tagName):返回属于命名空间namespaceURI的tagName元素的NodeList。
Element类型的变化
主要有:
getAttributeNS(namespaceURI,localName);
getAttributeNodeNS(namespaceURI,localName);
getElementsByTagNameNS(namespaceURI,tagName);
hasAttributeNS(namespaceURI,localName);
removeAttributeNS(namespaceURI,localName);
setAttributeNS(namespaceURI,qualifiedName,value);
setAttributeNodeNS(attNode);
NamedNodeMap类型的变化
主要有:
getNamedItemNS(namespaceURI,localName);
removeNamedItemNS(namespaceURI,localName);
setNamedItemNS(node);
其他方面的变化
DocumentType类型的变化
DocumentType类型新增了3个属性:publicId、systemId、internalSubset,以下面的HTML文档类型声明为例:
<!DOCTYPE HTML PUBLIC "-//w3c//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">console.log(document.doctype.publicId); //-//w3c//DTD HTML 4.01//EN console.log(document.doctype.systemId); //http://www.w3.org/TR/html4/strict.dtd
Document类型的变化
新增importNode()
,用途是从一个文档中取得一个节点,然后将其导入到另一个文档。接受两个参数:要复制的节点和一个表示是否复制子节点的布尔值;
DOM2级视图
另外,“DOM2级视图”模块添加了一个名为defaultView
的属性,其中保存着一个指针,指向拥有给定文档的窗口;IE不支持此属性,但有一个parentWindow
属性。
console.log(document.defaultView); //Window
或者:
console.log(document.defaultView || document.parentWindow); //Window
DOM2级核心
此外,“DOM2级核心”还为document.implementation对象规定了两个新方法:createDocumentType()
和createDocument()
;前者用于创建一个新的DocumentType节点,接收三个参数:文档类型名称、publicId、systemId如:
var doctype = document.implementation.createDocumentType("html","-//w3c//DTD HTML 4.01//EN","http://www.w3.org/TR/html4/strict.dtd");
后者则用来创建新文档,该方法接收3个参数:namespaceURI、标签名、文档类型;
结合前者,可以创建一个XHTML文档:
var doctype = document.implementation.createDocumentType("html","-//w3c//DTD HTML 4.01//EN","http://www.w3.org/TR/html4/strict.dtd");var doc = document.implementation.createDocument("http://www.w3.org/1999/xhtml","html",doctype);
DOM2级HTML
createHTMLDocument()
方法接收一个参数,即title元素的字符串;用来创建一个完整的HTML文档;
Node类型的变化
isSupported()
方法,该方法与hasFeature()
类似;建议最好还是使用能力检测;
isSameNode()
和isEqualNode()
这两个方法都接收一个节点参数,并在传入节点与引用的节点相同或相等的时候返回true。
另外还有setUserData()
方法和getUserData()
方法;
框架的变化
框架和内嵌框架分别用HTMLFrameElement和HTMLIFrameElement表示,它们在DOM2级中都有一个新属性contentDocument
这个属性包含一个指针,指向表示框架内容的文档对象。该对象在IE8中无效,但有contentWindow
属性,可以使用如下代码:
var iframe = document.getElementById("myIframe");var iframeDoc = iframe.contentDocument || iframe.contentWindow;