DOM描述了一个层次化的节点树,容许开发人员添加、移除和修改页面。javascript
根据 W3C 的 HTML DOM 标准,HTML 文档中的全部内容都是节点:html
每一个节点都有一个nodeType属性,用于代表节点的类型。并非全部节点类型都受到Web浏览器支持,最经常使用的事元素和文本节点。java
Node.ELEMENT_NODE(1); // 元素
Node.ATTRIBUTE_NODE(2); // 属性
Node.TEXT_NODE(3); // 文本
Node.CDATA_SECTION_NODE(4);
Node.ENTITY_REFERENCE_NODE(5);
Node.ENTITY_NODE(6);
Node.PROCESSING_INSTRUCTION_NODE(7);
Node.COMMENT_NODE(8); // 注释
Node.DOCUMENT_NODE(9); // 文档
Node.DOCUMENT_TYPE_NODE(10);
Node.DOCUMENT_FRAGMENT_NODE(11);
Node.NOTATION_NODE(12);node
由于IE没有公开Node类型的构造函数,因此肯定节点类型以下:跨域
// nodeType 是只读的 if (someNode.nodeType == 1) { alert("Node is an element"); }
一、nodeName 和 nodeValue 属性数组
// 使用前先检查节点类型,确认是不是一个元素,对于元素节点 // nodeName 保存的是标签名(节点的名称),nodeValue = null (节点的值); if (someNode.nodeType == 1) { value = someNode.nodeName; // nodeName的值是元素的标签名 }
二、 节点关系浏览器
每一个节点都有一个 childNodes 属性,保存着一个 NodeList 对象。安全
var firstChild = someNode.childNodes[0]; var secondChild = someNode.childNodes.item(1); // 将NodeList对象转化为数组 function convertToArray(nodes) { var array = null; try { array = Array.prototype.slice.call(node,0); // 针对非 IE 浏览器 } catch { array = new Array(); for (var i=0, len=nodes.length; I < len; i++) { array.push(nodes[I]); } } return array; }
三、操做节点app
如下方法都须要取得父节点(使用 parentNode 属性)dom
如下两个方法是全部类型的节点都有
JavaScript经过 Document 类型表示文档。在浏览器中,document 对象是 HTMLDocument(继承自 Document 类型)的一个实例,表示整个HTML页面。并且 document 也是 window 对象的一个属性,所以能够将其做为全局对象来访问。经过这个文档对象,不只能够取得与页面有关的信息,并且还能操做页面的外观及其底层结构。
一、文档的子节点
内置的访问子节点的快捷方式:
做为内置的HTMLDocument对象,document 对象有一个 body 属性,直接指向 <body> 元素。
// 全部浏览器都支持 var html = document.documentElement; // 取得对<html>对引用 var body = document.body; // 取得对<body>对引用
用不着在 document 对象上调用 appendChild()、removeChild()和replaceChild()方法,由于文档类型(若是存在)是只读的,并且它只能有一个元素子节点(一般早存在)。
二、文档信息
document 对象还有一些标准的Document对象所没有的属性。这些对象表现的网页的一些信息。
// 取的文档标题 var originalTitle = document.title; // 设置文档标题 document.title = "New page title"; // 取得完成的URL var url = document.URL; // 取的域名 var domain = document.domain; // 取的来源页面的URL var referrer = document.referrer;
三、查找元素
取得特定的某个或某组元素的引用,而后执行一些操做。
// 取得页面中全部的<img>元素,并返回一个HTMLCollection var images = document.getElementsByTagName("img"); alert(images.length); // 图像的数量 alert(images[0].src); // 第一个图像元素的src特性 alert(images.item(0).src); // 第一个图像元素的src特性
HMTLCollection 对象
<img src="my image.gif" name="myImage"> var myImage = images.namedItem("myImage"); var myImage = images["myImage"];
四、特殊集合
除了属性和方法,document 对象还有一些特殊的集合,都是 HTMLCollection对象,
五、DOM一致性检测
document.implementation 属性提供相应信息和功能的对象,与浏览器对 DOM 的实现直接对应。
规定一个方法:hasFeature(),接受两个参数:要检测的 DOM 功能名称及版本号
var hasXmlDom = document.implementation.hasFeature("XML","1.0");
六、文档写入
// 用 write() 和 written() 动态地包含外部资源 <html> <head> <title>document.write() Example</title> </head> <body> <script type="text/javascript"> document.write("<script type=\"text/javascript\" src=\"file.js\">" + "<\/script>"); </script> </body>
严格型 XHTML 文档不支持文档写入。
Element 类型用于表现 XML 或 HTML 元素,提供了对元素标签名、字节点及特性的访问。
<div id="myDiv"></div> var div = document.getElementById("myDiv"); alert(div.tagName); // "DIV" alert(div.tagName == div.nodeName); // true
在 HTML 中,标签名始终都以所有大写表示;而在 XML(有时包括 XHTML),标签名始终与源代码中的保持一致。
if (element.tagName.toLowerCase() == "div") { // 适用于任何文档 // ... }
一、HTML 元素
全部的 HTML 元素都由 HTMLElement 类型表示。每一个 HTML 元素都存在的下列标准特性。
// 上述这些属性均可以用来取得或修改相应的特性值 <div id="myDiv" class="bd" title="Body text" lang="en" dir="ltr"></div> var div = document.getElementById("myDiv"); alert(div.id); div.id = "someOtherId"; alert(div.className); div.className = "ft";
二、取得特性
每一个元素都有一或多个特性,这些特性的用途是给出相应元素或其内容的附加信息。
有两类特殊的特性:
div.setAttribute("id","someOtherId");
三、attributes 属性
attributes 属性包含一系列节点,每一个节点的 nodeName 就是特性的名称,而节点的 nodeValue 就是特性的值。
包含一个 NamedNodeMap,“动态”集合。
var id = element.attributes.getNamedItem("id").nodeValue; var id = element.attributes["id"].nodeValue;
遍历元素的特性,attributes 属性能够派上用场。
function outputAttributes(element) { var pairs = new Array(), attrName, attrValue, y, len; for(y = 0, len = element.attributes.length; y < len; y++) { attrName = element.attributes[y].nodeName; attrValue = element.attributes[y].nodeValue; if (element.attributes[y].specified) { pairs.push(attrName + "=\"" + attrValue + "\""); } } return pairs.join(" "); } // attributes 对象的中的特性,不一样浏览器返回的顺序不一样 // IE7 及更早版本会返回 HTML 元素中全部可能的特性,包括没有指定的特性。每一个特性节点都有一个 specified 的属性,true:在 HTML 中指定来相应特性,要么能够经过 setAttribute() 方法设置了该特性。
四、建立元素
// 接受一个参数,即要建立元素的标签名 var div = document.createElement("div"); // 也为新元素设置了 ownerDocument 属性,还能够操做元素的特性,添加更多的子节点 div.id = "myNewDiv"; div.className = "box"; // 新元素添加到文档树中 appendChild()、insertBefore()、replaceChild() document.body.appendChild(div);
在 IE 中能够另外一种方法,传入完整的元素标签
var div = document.createElement("<div id=\"myNewDiv\" class=\"box\"></div>");
五、元素的子节点
不一样浏览器看待节点是不一样的。
若是要经过 childNodes 属性遍历子节点,不要忘了浏览器之间的区别,一般先检查一下 nodeType 属性
for (var y = 0, len = element.childNodes.length; y < len; y++) { // 表示是元素节点 if (element.childNodes[y].nodeType == 1) { // ... } }
经过特定的标签名取得子节点或后代节点
var ul = document.getElementById("myList"); var items = ul.getElementsByTagName("li");
文本节点由 Text 类型表示,包含纯文本内容,即包含转义后的 HTML 字符,但不包含 HTML 代码。
经过 nodeValue 属性或 data 属性访问 Text 节点包含的文本。
在默认状况下,每一个能够包含内容的元素最多只能有一个文本节点,并且必须确实有内容存在。
// 没有内容,也就没有文本节点 <div></div> // 有空格,于是有一个文本节点 <div> </div> // 有内容,于是有一个文本节点 <div>hello world!</div> // 访问,先取得引用 var textNode = div.firstChild; // 获取 div.childNodes[0] textNode.nodeValue = "some other message";
在修改文本节点时,此时的字符串会经 HTML 编码(转义)。
一、建立文本节点
var element = document.createElement("div"); element.className = "message"; var textNode = document.createTextNode("Hello world"); element.appendChild(textNode); var anotherTextNode = document.createTextNode("Yippee"); element.appendChild(anotherTextNode); document.body.appendChild(element);
若是两个文本节点是相邻的同胞节点,那么这两个节点中的文本会连起来显示,中间不会有空格。
二、规范化文本节点
和 Text 类型类似,能够经过 nodeValue 或 data 属性来取得注释的内容。
<div id="myDiv"><!-- A comment --></div> // 经过父节点访问 var div = document.getElementById("myDiv"); var comment = div.firstChild; alert(comment.data);
使用 document.createComment() 为其传递注释文本也能够建立注释节点。
var comment = document.createComment("A comment");
若是要访问注释节点,必定要保证他们是 <html> 元素的后代。
不能把文档片断直接添加到文档中,但能够做为一个“仓库”,保存未来可能添加到文档中的节点。若是将文档中的节点添加到文档片断中,就会从文档树移除该节点,文档片断自己不会成为文档树的一部分。
// 建立文档片断 var fragment = document.createDocumentFragment(); // 为 ul 元素添加3个列表项 var ul = document.getElementById("myList"); var li = null; for (var i=0; i < 3; i++) { li = document.createElement("li"); li.appendChild(document.createTextNode("Item " + (i+1))); fragment.appendChild(li); } ul.appendChild(fragment);
元素的特性在 DOM 中以 Attr 类型来表示。特性就是存在于元素的 attributes 属性中的节点。
尽管是节点,但不是 DOM 文档树但一部分。有3个属性:
// 建立 var attr = document.createAttribute("align"); attr.value = "left"; // 添加到元素中 element.setAttributeNode(attr);