首页 > 代码库 > JavaScript高级程序设计31.pdf

JavaScript高级程序设计31.pdf

其它方面的变化

DOM的其他部分在“DOM2级核心”中也发生了一些变化,这些变化与XML命名空间无关,而是确保API的可靠性及完整性

DocumentType类型的变化

DocumentType类型新增了3个属性:publicId、systemId和internalSubset

其中前两个属性表示的是文档类型声明中的两个信息段,这两个信息段在DOM1级中没有办法访问到

alert(document.doctype.publicId);  //文档类型声明PUBLIC后的字符串

alert(document.doctype.systemId);  //文档类型声明"http"的字符串

访问document.doctype.internalSubset将得到"<!ELEMENT name (#PCDATA)>"这种内部子集很少用到

Document类型的变化

Document类型的变化中唯一与命名空间无关的方法是importNode(),这个方法的用途是从一个文档中取得一个节点,然后将其导入到另一个文档,使其成为这个文档结构的一部分,需要注意的是,每个节点都有一个ownerDocument属性(不同文档ownerDocument属性的值不一样)。如果调用appendChild()时传入的节点属于不同文档(ownerDocument属性的值不一样),则会导致错误,它接受2个参数:要复制的节点和一个是否复制子节点的布尔值,返回一个节点副本

var newNode=document.importNode(oldNode,true);

document.body.appendChild(newNode);

这个方法在HTML中并不常用,在XML文档用的比较多

“DOM2级视图”模块添加了一个名为defaultView的属性,其中保存着一个指针,指向拥有给定文档的窗口,除IE外所有浏览器支持这个属性,IE中有一个等价的属性名parentWindow(opera也支持这个属性)

var parentWindow=document.defaultView||document.parentWindow;

DOM2级核心还为document.implementation对象规定了两个新方法:createDocumentType()和createDocument(),前者用于创建一个新的DocumentType节点,接收3个参数:文档类型名称、publicId、systemId,由于既有文档的文档类型不能改变,因此createDocumentType()只在创建新文档时有用;创建新文档需要用到createDocument()方法,接收3个参数:针对文档中元素的namespaceURI、文档元素的标签名、新文档的文档类型(就是介绍的上一个属性)

//创建一个空的新XML文档

var doc=document.implementation.createDocument(" ","root",null);

这行代码创建一个没有命名空间的新文档,文档元素为<root>,没有指定文档类型

“DOM2级HTML”模块也为document.implementation新增一个方法:createHTMLDocument(),用途是创建一个完整的HTML文档,包括<html><head><title><body>元素,接收一个参数,即新创建的文档的标题(<title>元素里的字符串),返回新的HTML文档,只有Opera和Safari支持这个方法

Node类型的变化

Node类型中唯一与命名空间无关的变化,就是添加了isSupported()方法,与DOM1级为document.implementation引入的hasFeature()方法类似,用于确定当前节点具有什么能力,接收2个参数:特性名和特性版本号,返回true或false

if(document.body.isSupported("HTML","2.0")){

      //执行操作

      }

不推荐,最好使用能力检测

DOM3级引入了两个辅助比较节点的方法:isSameNode()和isEqualNode(),两个方法都接受一个节点参数,在传入节点与引用节点相同或相等时返回true。相同,两个节点引用的是同一个对象;相等,两个节点是相同类型,具有相等属性(nodeName、nodeValue等等), 而且他们的attributes和childNodes属性也相等

var div1=document.createElement("div");

div1.setAttribute("class","box");

var div2=document.createElement("div");

div2.setAttribute("class","box");

alert(div1.isSameNode(div1));  //true

alert(div1.isEqualNode(div2));  //true

alert(div1.isSameNode(div2));  //false

DOM3级为DOM节点添加额外数据引入了新方法:setUserData()将数据指定给节点,接收3个参数 要设置的键、实际的数据(可以是任何数据类型)和处理函数

document.body.setUserData("name","Nicholas",function(){});

//使用getUserData()传入相同的键,就可以取得该数据

var value=http://www.mamicode.com/document.body.getUserData("name");

传入setUserData()中的处理函数会在带有数据的节点被复制、删除、重命名或引入一个文档时调用,这个函数函数接收5个参数:表示操作类型的数值(1表示复制、2表示导入、3表示删除、4表示重命名)、数据键、数据值、源节点和目标节点。在删除节点时,源节点是null,在复制节点时,目标节点是null

可以采用  if(操作类型的数值==1){}这样的形式操作节点

框架的变化

框架和内嵌框架分别用HTMLFrameElement和HTMLIFrameElement表示,它们在DOM2级中都有一个新属性:contentDocument,这个属性包含一个指针,指向表示框架内容的文档对象

这个属性在IE8之前的版本无效,但所有浏览器都支持contentWindow属性(该属性返回框架的window对象,而这个window对象又有一个document属性),所以

var iframe=document.getElementById("myIframe");

var iframeDoc=iframe.contentDocument||iframe.contentWindow.document;