《Javascript 高级程序设计(第三版)》笔记0x13 DOM2和DOM3:DOM变化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/funkstill/article/details/85031492

目录

DOM变化

    针对XML命名空间的变化

        Node 类型的变化

        Document 类型的变化

        Element 类型的变化

        NamedNodeMap 类型的变化

     其他方面的变化

        DocumentType 类型的变化

        Document 类型的变化

         Node 类型的变化

        框架的变化


        DOM1 级主要定义的是 HTML 和 XML 文档的底层结构。 DOM2 和 DOM3 级则在这个结构的基础上引入了更多的交互能力,也支持了更高级的 XML 特性。为此, DOM2 和 DOM3级分为许多模块(模块之间具有某种关联),分别描述了 DOM 的某个非常具体的子集。这些模块如下。
        DOM2 级核心(DOM Level 2 Core):在 1 级核心基础上构建,为节点添加了更多方法和属性。
        DOM2 级视图(DOM Level 2 Views):为文档定义了基于样式信息的不同视图。
        DOM2 级事件(DOM Level 2 Events):说明了如何使用事件与 DOM 文档交互。
        DOM2 级样式(DOM Level 2 Style):定义了如何以编程方式来访问和改变 CSS 样式信息。
        DOM2 级遍历和范围(DOM Level 2 Traversal and Range):引入了遍历 DOM 文档和选择其特定部分的新接口。
        DOM2 级 HTML(DOM Level 2 HTML):在 1 级 HTML 基础上构建,添加了更多属性、方法和新接口。

DOM变化

        DOM2 级和 3 级的目的在于扩展 DOM API,以满足操作 XML 的所有需求,同时提供更好的错误处理及特性检测能力。从某种意义上讲,实现这一目的很大程度意味着对命名空间的支持。“DOM2 级核心”没有引入新类型,它只是在 DOM1 级的基础上通过增加新方法和新属性来增强了既有类型。“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 文档的元素就可以混合在一起,共同构成格式良好的文档,而不必担心发生命名冲突。从技术上说, HTML 不支持 XML 命名空间,但 XHTML 支持 XML 命名空间。

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Example XHTML page</title>
    </head>
    <body>
        Hello world!
    </body>
</html>

        想明确地为 XML命名空间创建前缀,可以使用 xmlns 后跟冒号,再后跟前缀。

<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml">
	<xhtml:head>
		<xhtml:title>Example XHTML page</xhtml:title>
	</xhtml:head>
	<xhtml:body xhtml:class="home">
		Hello world!
	</xhtml:body>
</xhtml:html>

        在混合使用两种语言的情况下,命名空间的用处就非常大了。  

<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<title>Example XHTML page</title>
	</head>
	<body>
		<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
			viewBox="0 0 100 100" style="width:100%; height:100%">
			<rect x="0" y="0" width="100" height="100" style="fill:red"/>
		</svg>
	</body>
</html>

        Node 类型的变化

在 DOM2 级中, Node 类型包含下列特定于命名空间的属性。
    localName:不带命名空间前缀的节点名称。
    namespaceURI:命名空间 URI 或者(在未指定的情况下是) null。
    prefix:命名空间前缀或者(在未指定的情况下是) null。

<!--当节点使用了命名空间前缀时,其 nodeName 等于 prefix+":"+ localName。-->
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<title>Example XHTML page</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>

 DOM3 级又引入了下列与命名空间有关的方法
    isDefaultNamespace(namespaceURI):在指定的 namespaceURI 是当前节点的默认命名空间的情况下返回 true。
    lookupNamespaceURI(prefix):返回给定 prefix 的命名空间。
    lookupPrefix(namespaceURI):返回给定 namespaceURI 的前缀。

alert(document.body.isDefaultNamespace("http://www.w3.org/1999/xhtml"); //true
//假设 svg 中包含着对<s:svg>的引用
alert(svg.lookupPrefix("http://www.w3.org/2000/svg")); //"s"
alert(svg.lookupNamespaceURI("s")); //"http://www.w3.org/2000/svg"

        Document 类型的变化

//创建一个新的 SVG 元素
var svg = document.createElementNS("http://www.w3.org/2000/svg","svg");
//创建一个属于某个命名空间的新特性
var att = document.createAttributeNS("http://www.somewhere.com", "random");
//取得所有 XHTML 元素
var elems = document.getElementsByTagNameNS("http://www.w3.org/1999/xhtml", "*");

        Element 类型的变化

“DOM2 级核心”中有关 Element 的变化,主要涉及操作特性。新增的方法如下。
    getAttributeNS(namespaceURI,localName):取得属于命名空间 namespaceURI 且名为localName 的特性。
    getAttributeNodeNS(namespaceURI,localName):取得属于命名空间 namespaceURI 且名为 localName 的特性节点。
    getElementsByTagNameNS(namespaceURI, tagName):返回属于命名空间 namespaceURI的 tagName 元素的 NodeList。
    hasAttributeNS(namespaceURI,localName):确定当前元素是否有一个名为 localName的特性,而且该特性的命名空间是 namespaceURI。注意,“DOM2 级核心”也增加了一个hasAttribute()方法,用于不考虑命名空间的情况。
    removeAttriubteNS(namespaceURI,localName):删除属于命名空间 namespaceURI 且名为 localName 的特性。
    setAttributeNS(namespaceURI,qualifiedName,value):设置属于命名空间 namespaceURI 且名为 qualifiedName 的特性的值为 value。
    setAttributeNodeNS(attNode):设置属于命名空间 namespaceURI 的特性节点。

        NamedNodeMap 类型的变化

    getNamedItemNS(namespaceURI,localName):取得属于命名空间 namespaceURI 且名为localName 的项。
    removeNamedItemNS(namespaceURI,localName):移除属于命名空间 namespaceURI 且名为 localName 的项。
    setNamedItemNS(node):添加 node,这个节点已经事先指定了命名空间信息。 

     其他方面的变化

        DocumentType 类型的变化

        DocumentType 类型新增了 3 个属性: publicId、 systemId 和 internalSubset。其中,前两个属性表示的是文档类型声明中的两个信息段,这两个信息段在 DOM1 级中是没有办法访问到的。

<!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"。-->

        Document 类型的变化

        Document 类型的变化中唯一与命名空间无关的方法是 importNode()。

var newNode = document.importNode(oldNode, true); //导入节点及其所有子节点
document.body.appendChild(newNode);

       “DOM2 级视图”模块添加了一个名为 defaultView 的属性,其中保存着一个指针,指向拥有给定文档的窗口(或框架)。

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

       “DOM2 级核心”还为 document.implementation 对象规定了两个新方法: createDocumentType()和 createDocument()。

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);

       “DOM2 级 HTML”模块也为 document.implementation 新增了一个方法,名叫 createHTMLDocument()。

/*这个方法的用途是创建一个完整的 HTML 文档,包括<html>、 <head>、 <title>和<body>元素。
这个方法只接受一个参数,即新创建文档的标题(放在<title>元素中的字符串),返回新的 HTML 文档*/
var htmldoc = document.implementation.createHTMLDocument("New Doc");
alert(htmldoc.title); //"New Doc"
alert(typeof htmldoc.body); //"object"

         Node 类型的变化

        Node 类型中唯一与命名空间无关的变化,就是添加了 isSupported()方法。

if (document.body.isSupported("HTML", "2.0")){
    //执行只有"DOM2 级 HTML"才支持的操作
}

        DOM3 级引入了两个辅助比较节点的方法: isSameNode()和 isEqualNode()。

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 个参数:要设置的键、实际的数据(可以是任何数据类型)和处理函数。使用 getUserData()并传入相同的键,就可以取得该数据。

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"

        框架的变化

        框架和内嵌框架分别用 HTMLFrameElement 和 HTMLIFrameElement 表示,它们在 DOM2 级中都有了一个新属性,名叫 contentDocument。这个属性包含一个指针,指向表示框架内容的文档对象。在此之前,无法直接通过元素取得这个文档对象(只能使用 frames 集合)。

var iframe = document.getElementById("myIframe");
var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;

猜你喜欢

转载自blog.csdn.net/funkstill/article/details/85031492