DOM 的其他部分在“DOM2 级核心”中也发生了一些变化。这些变化与XML 命名空间无关,而是
更倾向于确保API 的可靠性及完整性。
1. DocumentType 类型的变化
DocumentType 类型新增了3 个属性:publicId、systemId 和internalSubset。其中,前两
个属性表示的是文档类型声明中的两个信息段,这两个信息段在DOM1 级中是没有办法访问到的。以
下面的HTML 文档类型声明为例。
<!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"。在支持DOM2 级的浏览器中,应该可以运行下列代码。
alert(document.doctype.publicId); alert(document.doctype.systemId);实际上,很少需要在网页中访问此类信息。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" [<!ELEMENT name (#PCDATA)>] >访问document.doctype.internalSubset 将得到"<!ELEMENT name (#PCDATA)>"。这种内部
制的节点和一个表示是否复制子节点的布尔值。返回的结果是原来节点的副本,但能够在当前文档中使
用。来看下面的例子:
var newNode = document.importNode(oldNode, true); //导入节点及其所有子节点 document.body.appendChild(newNode);这个方法在HTML 文档中并不常用,在XML 文档中用得比较多(更多讨论请参见第18 章)。
var parentWindow = document.defaultView || document.parentWindow;var parentWindow = document.defaultView || document.parentWindow;
var doctype = document.implementation.createDocumentType("html", "-//W3C//DTD HTML 4.01//EN", "http://www.w3.org/TR/html4/strict.dtd");由于既有文档的文档类型不能改变,因此createDocumentType()只在创建新文档时有用;创建
var doc = document.implementation.createDocument("", "root", null);这行代码会创建一个没有命名空间的新文档,文档元素为<root>,而且没有指定文档类型。要想
var doctype = document.implementation.createDocumentType("html", " -//W3C//DTD XHTML 1.0 Strict//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"); var doc = document.implementation.createDocument("http://www.w3.org/1999/xhtml", "html", doctype);这样,就创建了一个带有适当命名空间和文档类型的新XHTML 文档。不过,新文档当前只有文档
var htmldoc = document.implementation.createHTMLDocument("New Doc"); alert(htmldoc.title); //"New Doc" alert(typeof htmldoc.body); //"object"通过调用createHTMLDocument()创建的这个文档,是HTMLDocument 类型的实例,因而具有该
if (document.body.isSupported("HTML", "2.0")){ //执行只有"DOM2 级HTML"才支持的操作 }由于不同实现在决定对什么特性返回true 或false 时并不一致,这个方法同样也存在与hasFeature()
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这里创建了两个具有相同特性的<div>元素。这两个元素相等,但不相同。
document.body.setUserData("name", "Nicholas", function(){});然后,使用getUserData()并传入相同的键,就可以取得该数据,如下所示:
var value = document.body.getUserData("name");传入setUserData()中的处理函数会在带有数据的节点被复制、删除、重命名或引入一个文档时
var div = document.createElement("div"); div.setUserData("name", "Nicholas", function(operation, key, value, src, dest){ if (operation == 1){ dest.setUserData(key, value, function(){}); } }); var newDiv = div.cloneNode(true); alert(newDiv.getUserData("name")); //"Nicholas"这里,先创建了一个<div>元素,然后又为它添加了一些数据(用户数据)。在使用cloneNode()
4.框架的变化
框架和内嵌框架分别用HTMLFrameElement 和HTMLIFrameElement 表示,它们在DOM2 级中都有
了一个新属性,名叫contentDocument。这个属性包含一个指针,指向表示框架内容的文档对象。在此
之前,无法直接通过元素取得这个文档对象(只能使用frames 集合)。可以像下面这样使用这个属性。
var iframe = document.getElementById("myIframe"); var iframeDoc = iframe.contentDocument; //在IE8 以前的版本中无效由于contentDocument 属性是Document 类型的实例,因此可以像使用其他HTML 文档一样使
var iframe = document.getElementById("myIframe"); var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;所有浏览器都支持contentWindow 属性。