什么是DOM?

DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API(应用程序编程接口)。DOM描绘了一个层次化的节点树,允许开发人员添加、移除和修改页面的某一部分。

文档节点(document)是每个文档的根节点。文档元素是文档的最外层元素,文档中的其他所有元素都包含在文档元素之中。在HTML页面中,文档元素始终都是元素。在 XML 中,没有预定义的元素,因此任何元素都可能成为文档元素。

每一段标记都可以通过树中的一个节点来表示: HTML 元素通过元素节点表示,特性(attribute) 通过特性节点表示,文档类型通过文档类型节点表示,而注释则通过注释节点表示。总共有 12 种节点 类型,这些类型都继承自一个基类型。

节点介绍

Node 类型

1)NodeList是一种类数组对象,用于保存一组有序的节点,可以通过位置来访问这些节点。NodeList是类数组对象,可以使用对Arguments对象同样的Array.prototype.slice()方法将其转换为数组。

function convertToArray(nodes){
var array = null;
try{
array = Array.prototype.slice.call(nodes, 0);
} catch (ex) {
array = new Array();
for (var i = 0, len=nodes.length; i<len; i++){ //在IE8及更早版本中不支持上面语句
array.push(nodes[i]);
}
}
return array;
}

2)下图是各节点之间的关系图:一个Node可以通过previousSibling和nextSibling来访问它的同级前后节点。一个parentNode的firstNode(someNode.childNode[0])是没有previousSibling的。

3)操作节点

DOM提供了一些操作节点的方法,其中最常用的就是appendChild(),用于向childNodes列表末尾添加一个节点。由于DOM节点不能够同时出现在文档的多个位置上,所以若果在调用appendChild()时传入父节点的第一个子节点,那么这个子节点就会成为该父节点的最后一个节点。

var returnNode = someNode.appendChild (someNode.firstNode);
alert(returnNode == someNode.firstNode); //false
alert(returnNode == someNode.lastNode); //true

操作节点的其他方法还有insertBefore(new, theafter), replaceChild(new, thereplaced), removeChild(theremoved)

有两个方法是所有节点都有的。第一个就是cloneNode(),用于创建一个与调用该函数一模一样的节点副本。该方法接受一个布尔值参数,如果是true的话,执行深层复制。cloneNode()不会复制DOM节点的JavaScript属性,但IE存在bug会复制该节点上的事件处理程序。建议使用cloneNode时建议先移除该节点上的事件处理程序。

Document类型

Document的属性们

Document节点有两个内置的访问其子节点的快捷方式,一个是documentElement属性,该属性始终指向HTML页面中的<html>元素,还有一个是通过childNodes列表访问文档元素。同时,作为HTMLDocument的实例,document还有一个body属性,直接指向<body>元素。

Document还有一些属性提供了了网页的文档信息,他们是URL、domain和referrer属性。URL属性中包含了页面完整的URL,domain属性中只包含页面的域名,而referrer属性中则保存着链接到当前页面的那个页面的URL。

<!--可以使用document.referrer来实现页面的返回跳转(经测试可以携带参数)-->
<!--from.html页面-->
<a href="to.html">点击跳到to.html</a> <!--to.html页面-->
<a href="#" onclick="window.location.href = document.referrer">点击跳回去</a>

  而且还可以通过document.domain来解决跨域的问题。由于跨域安全限制,来自不同子域的页面无法通过JavaScript通信。而通过将每个页面的document.domain设置为相同的值,这些页面就可以相互访问对方包含的Javascript对象了。

Document的方法们

为了获取某个或某些特定的元素,Document对象提供了两个特定的方法:getElementById()和getElementsByTagName()。

note 1:getElementById()在IE7及其较低版本中有一个怪癖,就是name特性与给定ID匹配的表单元素也会被该方法返回。所以为了避免出现此问题,要避免表单字段的name特性与其他元素的ID相同。

note 2:要想获得文档中的所有元素,可以向getElementsByTagName()中传入"*"。在JavaScript及CSS中,星号(*)通常表示全部。但是由于IE将注释实现为元素,因此该代码在IE中会返回所有注释节点。

note 3:HTMLDocument还有一个特定的方法getElementsByName(),通常用来取得所有单选按钮元素。

Element类型

Element的属性们

Element类型提供了对元素标签名、子节点及特性的访问。

可以像下面这样取得这个元素及其标签名:

var div = document.getElementById("myDiv");  //这个就是Element节点
alert(div.tagName); // "DIV"
/* 在HTML中,标签名始终都以全部大写表示 */
alert(div.tagName == "div"); // false
alert(div.tagName.toLowerCase() == "div"); // true
alert(div.id); // myDiv
alert(div.className); //div-class

同时,Element还具有一个attributes来保存他的所有属性。

var span = document.getElementById("id"),
pairs = new Array(),
attrName,
attrValue,
i,
len; for(i=0,len=span.attributes.length; i<len;i++){
attrName = span.attributes[i].nodeName;
attrValue = span.attributes[i].nodeValue;
pairs.push(attrName + attrValue);
}
console.log(pairs.join(" ")); //把数据间隔的小逗号换成空格

Element的方法们

可以使用getAttribute() /setAttribute() /removeAttribute()来获取元素特性。同时,getAttribute()还可以取得自定义特性。

<div id="myDiv" my_special_attribute="hello!"></div>
<script>
var div = document.getElementById("myDiv");
alert(div.getAttribute("id")); // myDiv
alert(div.getAttribute("my_special_attribute")); // hello!
</script>

使用document.createElement()方法可以创建新元素。但此时创建的元素还没有被添加到文档流中,可以用appendChild()/ insertBefore()/ replaceChild()。

document.createElemnt("div");
document.body.appendChild(div);

Text类型

文本节点由Text类型表示,包含的是可以按字面解释的纯文本内容。纯文本中可以包含转义后的HTML字符,但不能包含HTML代码。默认情况下,每个可包含内容的元素最多只能有一个文本节点,而且必须确实有内容存在。可以通过下列方法对节点进行操作。

  • appendData(text);             //将文本添加到节点的末尾
  • deleteData(offset, count);   //删除文本
  • insertData(offset, text);         //插入文本
  • replaceData(offset, count, text);     //替换文本
  • splitText(offset);            //分成两个文本节点,是从文本节点中提取数据的一种常用DOM解析技术。
  • substringData(offset, count);     //返回被选中的字符串
<div id="sp">现在的时间是</div>
<script>
var text = document.getElementById("sp");
text.firstChild.appendData(new Date()); //一定要加firstChild()因为具有该方法的是元素节点的子节点(文本节点)
text.firstChild.nodeValue = "Some other message"; //nodeValue和data中保存这相同的值
</script>

使用document.createTextNode()创造新的文本节点。

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

var textNode = document.createTextNode("Hello world!");
element.appendChild(textNode); document.body.appendChild(element);

DOM扩展

尽管DOM作为API已经非常完善了,但为了实现更多功能,仍然会有一些标准或专有的扩展。本章介绍两个DOM的扩展。

选择符API

其实jQuery的核心就是通过CSS选择符查询DOM文档取得元素的引用,从而抛开了getElementById()和getElementByTagName()。而选择符API让浏览器原生支持CSS查询。

var myDiv = document.querySelector("#myDiv");   //返回一个元素
var div = document.querySelectorAll("div"); //返回的是一个nodelist实例

空格不作为文本节点返回

对于元素间的空格,IE9及之前版本不会反回文本节点,而其他所有浏览器都会返回文本节点,这样就导致了在使用childNodes和firstChild等属性时行为不一致。所以ElementTraversal API 为DOM元素添加了一下五个属性。

  • childElementCount: 返回不包括文本节点和注释的子元素个数;
  • firstElementChild: firstChild的元素版;
  • lastElementChild: lastChild的元素版;
  • previousElementSibling: 指向前一个同辈元素,previousSibling的元素版;
  • nextElementSibling: 指向后一个同辈元素,nextSibling的元素版。

HTML5 API

在HTML的前几个版本中,主要篇幅都用于定义标记,而与JavaScript相关的内容都交由DOM规范去定义。而HTML5却围绕着如何定义标记定义了大量JavaScript API。

getElementsByClassName()方法

获取具有统一类的DOM Element节点,返回一个nodeList。不再赘述。

classList属性

classList属性保存了元素当前的所有类,支持该属性的浏览器有FF3.6+和Chrome。

div.classList.add(value);    //为元素添加指定的类
div.classList.contains(value); //判断元素是否含有指定的类,如果存在返回true
div.remove(value); //删除指定的类
div.toggle(value); //有就删除,没有就添加指定类

JavaScript高级程序设计-10.11: DOM及其扩展的更多相关文章

  1. JavaScript高级程序设计学习笔记--DOM

    DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序接口). Document类型 文档的子节点 虽然DOM标准规定Document节点的子节点可以是DocumentType,Ele ...

  2. JavaScript高级程序设计10.pdf

    String类型有几种操作字符串的方法 concat()方法拼接任意多个字符串,不修改原字符串 var stringValue=“hello ”; var result=stringValue.con ...

  3. 读javascript高级程序设计00-目录

    javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...

  4. 读javascript高级程序设计-目录

    javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...

  5. 【javascript学习——《javascript高级程序设计》笔记】DOM操作

    DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口).DOM描绘了一个层次节点树,允许开发人员添加.移除和修改. 1.节点层次 <html> <head& ...

  6. 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介

    前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...

  7. 《JavaScript高级程序设计》学习笔记

    系统学习JS, 从<JavaScript高级程序设计>入门,通过学习jQuery或者angularJS源码来进阶. 第1章 JavaScript简介 1.JS问世的目的是处理以前由服务器端 ...

  8. JavaScript高级程序设计第三版.CHM【带实例】

    从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...

  9. javascript高级程序设计学习笔记

    javascript高级程序设计,当枕头书已经好久了~zz  现在觉得自己在js的开发上遇到了一些瓶颈,归根究底还是基础太薄弱,所以重新刷一遍js高程希望有更新的认识. 一.javascript简介 ...

随机推荐

  1. 关于this指针理解

    1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将 ...

  2. “inno setup打包,win7下安装没有桌面快捷方式,xp下安装正常”

    修改桌面的快捷键为选中就行了:Flags: checkablealone;在[Tasks]下面修改代码如下:Name: "desktopicon"; Description: &q ...

  3. BZOJ 1196 二分答案+并查集

    http://www.lydsy.com/JudgeOnline/problem.php?id=1196 题目大意:n个城市,m-1条路,每条路有一级公路和二级公路之分,你要造n-1条路,一级公路至少 ...

  4. UIView 面面观

    原创:转载请注明出处 1.UIView: 一个视图对象控制该区域的渲染,同时也控制内容的交互. 2.UIView的功能就是:展示.渲染.交互 3.UIView 和很多其他视图控件的默认tag值是0,所 ...

  5. android 修改listview item view 的方法(转)

    android 修改listview item view 的方法   具体的解答办法很简单: 代码如下 : 1.获取需要更新的view int visiblePosition = mListView. ...

  6. Struts2.3.16日志(中)

    Result Configuration --Result 配置 当一个操作类方法完成后,它将返回一个字符串.字符串的值是用来选择一个元素的结果.一个操作映射的结果往往会有一组代表不同的可能的结果.一 ...

  7. Cannot find PHPUnit in include path phpstorm

    This is the way to do it without using composer, and using your global phpunit.Phpunit now comes wit ...

  8. java fx example

    http://www.java2s.com/Tutorials/Java/JavaFX/1500__JavaFX_WebEngine.htm

  9. java采用Apache FileUpload组件实现上传

    可见:FileItemSteam(servletFileUpload.getItemIterator(httpServletRequest))速度要快于FileItem(servletFileUplo ...

  10. 织梦网站底部的Power by DedeCms怎么去掉?

    由于织梦DEDECMS程序6月份的漏洞,很多织梦网站都被黑了,所以大家都在抓紧时间更新系统补丁.但是这次的DEDECMS V5.7版本更新后,在前台网页底部会出现织梦版权信息 “powered by ...