javascript DOM详解之DOM2与DOM3

DOM2与DOM3主要是在DOM1的基础上引入更多的交互能力,支持了更高级的XML特性。
DOM2做的主要的扩展子集具体为:
DOM Level 2 Core:在一级核心的基础上,为节点添加了更多的方法和属性。
DOM Level 2 Views:为文档定义了基于样式信息的不同视图
DOM Level 2 Events:说明了如何使用事件与DOM进行交互。
DOM Level 2 Style:定义了如何以编程的方式来访问和改变CSS样式的信息
DOM Level 2 Traversal and Range:引入了遍历DOM和选择其特定部分的新接口
DOM Level 2 HTML:在一级的HTML上构建添加了更多的属性、方法和新接口

DOM的变化
DOM2和DOM3,实现了对既有的API进行扩展,提供了更好的错误处理以及特性检测能力。这从很大程度上支持了命名空间。要确定浏览器是否支持DOM2和DOM3,可以使用以下的代码:
var supportsDOM2Core=document.implementation.hasFeature("Core","2.0");
var supportsDOM3Core=document.implementation.hasFeature("Core","3.0");
var supportsDom2HTML=document.implementation.hasFeature("HTML","2.0");
var supportsDOM2Views=document.implementation.hasFeature("Views","2.0");
var supportsDom2XML=document.implementation.hasFeature("XML","2.0");

针对XML命名空间的变化
有了XML的命名空间,不同XML可以合并成为一个XML。从技术上说,html不支持XML命名空间,但是XHTML支持。命名空间要使用xmlns特性来指定。
使用示例:
 xmlns="http://www.w3.org/1999/xhtml">, 使用它来替换
但是,想要明确的为XML命名空间创建前缀,可以使用xmlns后跟冒号,再后跟前缀。
  "http://www.w3.org/1999/xhtml" > ,使用它来替换
为了区分XHTML中元素,避免混乱,也需要使用命名空间来进行限定标签名称和标签属性。

DOM2提供的针对命名空间的解决方法
1.Node类型的方法
在DOM2级别中,Node类型包含特定于命名空间的属性
localname:不带命名空间前缀的节点名称
namespaceURI:命名空间的URI或者(未指定的情况下)null
prefix:命名空间前缀或者(未指定的情况下)null
当节点使用命名空间前缀时,其nodeName等于prefix+":"+localName
例如:
         
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的前缀
2.Document类型的变化
DOM2为命名空间创建了一下的方法:方法的意义类似DOM1的
createElementNS(namespaceURI,tagName):
createAttributeNS(namespaceURI,attributeName):
getElementsByTagNameNS(namespaceURI,tagName):
3Element类型的变化
DOM2级核心中有关Element的变化主要涉及操作特性。新增方法具体意义参见DOM1的:
getAttributeNS(namespaceURI,localname):
getAttributeNodeNS(namespaceURI,localname):
getElementsByTagNameNS(namespaceURI,tagName):
hasAttributeNS(namespaceURI,attributeName):
removeAttributeNS(namespaceURI,attributeName):
setAttributeNS(namespaceURI,qualifiedName,value):
setAttributeNodeNS(attNode):
4.NamedNodeMap类型的变化,同上
getNamedItemNS(namespaceURI,localName):
removeNamedItemNS(namespaceURI,localName):
setNamedItemNS(node):

其它方面的变化
这些变化与XML命名空间无关,而是更倾向于确保API的可靠性和完整性。
1.DocumentType类型的变化
新增了三个属性:
publicId:
systemId:
interbalSubset:
以下面的标签为例:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 //EN"  "http://www.w3.org/TR/html4/strict.dtd">
publicId=-//W3C//DTD HTML 4.01 //EN
systemId= http://www.w3.org/TR/html4/strict.dtd  
  最后一个属性interSubset不常用,访问内部子集用的,XML用的较多。
2.Document类型的变化
唯一与命名空间无关的方法是importNode(),这个是用来从一个文档中取得一个节点,然后导入另一个文档的,使其成为另一个文档结构的一部分。它接收两个参数:要复制的节点和一个鄙视是否复制子节点的布尔值。
var newNode=document.importNode(oldNode,true);
document.body.appendChild(newNode);
在DOM2视图中,新加了一个属性defaultView属性,指向拥有给定文档的窗口。IE中的等价属性是parentWindow,因此要确定文档的归属窗口,可以使用以下代码:
var parentWindow=document.defaultView||document.parentWindow;
除了上述的方法和属性外,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");
创建新文档的时候要使用createDocument()方法,接收三个参数:针对文档元素的namespaceURI,,文档元素的标签名,新文档的文档类型。例子:
var doc=doucment.implementation.createDocument("","root",null);//xml document
var  doc=document.implementation.createDocument("http://www.w3.org/1999/xhtml","html",doctype);//xhtml;
新增的创建HTML文档的方法
var htmldoc=document.implementation.createHTMLDocument("new doc");
3.Node类型的变化
Node类型中唯一与命名空间无关的新增方法是isSupported(),它被用来确定当前节点具有什么能力,接收两个参数:特性名称和特性版本号。
if(document.body.isSupported("HTML","2.0")){//支持DOM2级HTML支持的操作}
DOM3引入了两个辅助比较节点的方法:isSameNode()和isEqualNode(),都只接受一个参数,如果传入的节点和引用的节点一样,则返回true。相等与节点相同是不一样的。
DOM3还针对DOM节点添加额外的数据新引入了新的方法。其中setUserData()方法会将给定的数据给节点,它接收三个参数:要设置的key,实际的数据,处理函数。
document.body.setUserData("name","Nicholas",function(){});
var value=document.body.getUserData("name");
传入setUserData()中的处理函数会在带有数据的节点被复制、删除、重命名或引入一个文档时调用,因而你可以决定在上述操作发生时如何处理数据。处理函数要接受5个参数:操作类型的数值(1表示复制,2表示导入,3表示删除,4表示重命名)、数据键、数据值、源节点和目标节点。在删除节点时,源节点为null;复制时,目标节点为null。
var div=document.createElement("div");
div.setUserData("name","Nicholas",function(operation,key,value,src,dest){
  if(operation==1){
  dest.setUserData(key,value,function(){  });
  }      
   });
var mydiv=div.cloneNode(true);
alert(mydiv.getUserData("name"));
4.框架的变化
框架和内嵌框架分别用HTMLFrameElement和HTMLIFrameElement表示,它们在DOM2中都有了一个新的属性:contentDocument,它指向表示框架内容的文档对象。
var iframe=document.getElementById("myIframe");
var iframeDoc=iframe.contentDocument||iframe.contentWindow.document;


样式
在HTML中定义样式的方式有3种:通过元素包含外部样式表文件、使用