DOM 的其他部分在“DOM2 级核心”中也发生了一些变化。这些变化与XML 命名空间无关,而是
更倾向于确保API 的可靠性及完整性。
1. DocumentType 类型的变化
DocumentType 类型新增了3 个属性:publicId、systemId 和internalSubset。其中,前两
个属性表示的是文档类型声明中的两个信息段,这两个信息段在DOM1 级中是没有办法访问到的。以
下面的HTML 文档类型声明为例。
对这个文档类型声明而言,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);
实际上,很少需要在网页中访问此类信息。
] >
访问document.doctype.internalSubset 将得到""。这种内部
制的节点和一个表示是否复制子节点的布尔值。返回的结果是原来节点的副本,但能够在当前文档中使
用。来看下面的例子:
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);
这行代码会创建一个没有命名空间的新文档,文档元素为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
这里创建了两个具有相同特性的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"
这里,先创建了一个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 属性。