概念

文档对象模型(DOM)是表示和操作HTML和XML文档内容的基础API。

选取文档元素

(1)通过ID选取元素

  1. var id = document.getElementById("section1");
  2.  
  3. <input type="text" id="section1" value="">

【注】在低于IE8版本的浏览器中,getElementById()对于匹配元素的ID不区分大小写,而且也返回匹配name属性的元素。

(2)通过名字选取元素

HTML的name属性最初打算为表单元素分配名字,在表单数据提交到服务器时使用该 属性的值。类似id属性,name是给元素分配名字,但是区别于id,name属性的值不是必须唯一:多个元素可能有同样的名字,在表单中,单选和复选框按钮通常是这种情况。而且,和id不一样的是name属性只在少数HTML元素中有效,包括表单、表单元素、<iframe>和<img>元素。

基于name属性的值选取HTML元素,可以使用Document对象的getElementsByName()方法。

  1. var arr = document.getElementsByName("fav_color"); //通过name,返回一个HTMLElement集合
  2.  
  3. <input type="text" name="fav_color" />

【注】getElementsByName()定义在HTMLDocument类中,而不在Document类中,所以它只针对HTML文档可用,在XML文档中不可用。它返回一个NodeList对象,后者的行为类似一个包含若干个Element对象的只读数组。通过实践证明在IE9以及IE9以下,getElementsByName()也返回id属性匹配指定值的元素。为了兼容,应该小心谨慎,不要将同样的字符串同时用做name和id。

(3)通过标签名获取元素

Document对象的getElementByTagName()方法可用来选取指定类型(标签名)的所有HTML或XML元素。例如在文档中获得包含所有<span>元素的只读的类数组对象。

  1. var spans = document.getElementsByTagName("span");
  2.  
  3. <span></span>

(4)通过CSS选择器选取元素

  1. #warning /*通过id*/
  2.  
  3. .warning /*通过class*/
  4.  
  5. input /*所有input元素*/
  6.  
  7. <input type='text" class="warning" id="warning" value="">

(5)document.all[]

在DOM标准化之前,IE 4引入了document.all[]集合来表示所有文档中的元素(除了Text节点)。document.all[]方法已经被标准的方法(如getElementById()和getElementsByTagName())等所取代,现在已经废弃不应该再使用。

文档的节点树

Document对象、它的Element对象和文档中表示文本的Text对象都是Node对象。Node定义了以下重要的属性:

(1)parentNode

该节点的父节点,或者针对类似Document对象应该是null,因为它没有父节点。【获取当前元素的父节点】

(2)childNodes

只读的类数组对象(NodeList对象),它是该节点的子节点的实时表示【返回指定节点的所有子节点】

(3)firstChild、lastChild

该节点的子节点中第一个和最后一个,如果该节点没有子节点则为null【获取当前节点的第一个(childNodes[0])或最后一个节点 (childNodes[length-1])】

(4)nextSibling

该节点的下一个节点:得到下一个元素【这个元素的类型可以包含空文本节点】

(5)previoursSibling

获取当前节点的上一个节点【nextElementSibling只能得到元素结点】

节点

(1)nodeType【节点类型】

  • Element(元素即指标签)   <span></span>                                                 用1表示
  • Attr(属性)                    <span color="red"></span                                 用2表示
  • Text(文本)                   <span>this is a simple document</span>              用3表示
  • Comments(注释)          <!-- this is a comments-->                               用8表示
  • Document(文档)           alert(window.document.nodeType);                      用9表示

(2)nodeName【节点名称】

返回的结果都是大写, 文本的nodeName是#text,注释的nodeName是#comment

(3)nodeValue【节点值】

只对文本节点和注释有用,对于标签没有作用

创建、插入和删除节点

(1)创建Element元素节点

  1. var element = document.createElement("span");

(2)插入节点

appendChild()和insertBefore()方法

  1. var list = document.getElementById("list");
  2.  
  3. var li = document.createElement("li");
  4.  
  5. li.appendChild(li); /*将创建的元素li添加到父元素list中*/
  6.  
  7. list.insertBefore(li, list.childNodes[]); /*插入到list.chldNodes[3]前面*/ 在元素内部指定节点插入子节点
  8.  
  9. <ul id = "list"></ul>

【注】在给标签赋值时如果是双标签即如<span></span>则其赋值用innerHTML或者innerText,否则如单标签如<input type="text" />则赋值为value

(3)删除和替换节点

removeChild()方法是从文档树中删除一个节点。但是请放心:该方法不是在待删除的节点上调用,而是在其父节点上调用。在父节点上调用该方法,并将需要删除的子节点作为方法参数传递给它。在文档中删除n节点,代码你可以这样写:

  1. n.parentNode.removeChild(n);

replaceChild()方法删除一个子节点并用一个新的节点取而代之。在父节点上调用该方法,第一个参数是新节点,第二个参数是需要代替的节点。例如

  1. n.parentNode.replaceChild(document.createElement("span"),n);

作为元素树的文档

当将主要的兴趣点集中在文档的元素上而非它们之间的 文本(或者是空文本)  上时,这个时候我们将文档看做是Element对象树,忽略部分文档: Text和Comment节点  。【注】Text和Comment节点没有children属性,它意味着上述Node.parentNode属性不可能返回Text或Comment节点。任何Element的parentNode总是另外一个Element,或者,追溯到树根的Document或DocumentFragment节点。其对应的基于元素属性的节点有:

  1. firstElementChildlastElementChild
  2.  
  3. /*类似firstChild和lastChild,但只代表Element*/
  4.  
  5. nextElementSiblingpreviousElementSibling
  6.  
  7. /*类似nextSibling和previousSibling,但只代表Element*/
  8.  
  9. childElementCount
  10.  
  11. /*子元素的数量。返回的值和children.length值相等*/

使用DocumentFragment

DocumentFragment是一种特殊的Node,它作为其他节点的一个临时容器。像这样创建一个DocumentFragment:

  1. var frag = document.createDocumentFragment();

DocumentFragment是独立的,而不是任何其他文档的一部分。它的parentNode总是为null,但类似Element,它可以有任意多的子节点,可以用appendChild()、insertBefore()等方法来操作它们。

它的特殊之处在于它使得一组节点被当做一个节点看待:如果给appendChild()、insertBefore()或replaceChild()传递一个DocumentFragement,其实是将该文档片段的所有子节点插入到文档中,而非片段本身。由于javascript在操作DOM时都会重新加载整个文档的DOM,为了减少DOM操作可以在操作DOM(为其添加或删除属性时)可以将DOM放入DocumentFragment中,最后一次性操作文档碎片,DocumentFragment可以相当于缓冲区,当需要更新大量的DOM节点时,页面会进行大量的渲染,这样将大大的降低了性能,为此可以用DocumentFragment将所有渲染的节点放入内存中,最后进行一次性渲染,这样既可减轻浏览器的负担也可提高页面渲染的速度。

以下函数使用DocumentFragment来倒序排列一个节点的子节点:

  1. /*加载DOM树调用函数进行逆序输出*/
  2. window.onload = function() {
  3. reverse(document.getElementById("list"));
  4. }
  5.  
  6. function reverse(n){
  7.  
  8. /*创建一个DocumentFragment作为临时容器*/
  9.  
  10. var f = document.createDocumentFragment();
  11.  
  12. /*从后至前循环子节点,将每一子节点移动到文档片段中。n的最后一个节点变成f的第一节点,反之亦安然。注意,给f添加一节点,该节点自动地会从n中删除*/
  13.  
  14. while(n.lastChild) f.appendChild(n.lastChild);
  15.  
  16. /*最后,把所有得子节点一次性全部移回n中*/
  17.  
  18. n.appendChild(f);
  19.  
  20. }
  21.  
  22. <ul id = "list">
  23. <li><span><a href = "#"></a></span></li>
  24. <li><span><a href = "#"></a></span></li>
  25. <li><span><a href = "#"></a></span></li>
  26. <li><span><a href = "#"></a></span></li>
  27. <li><span><a href = "#"></a></span></li>
  28. <li><span><a href = "#"></a></span></li>
  29. </ul>

(第六天)DOM的更多相关文章

  1. 《JavaScript权威指南》学习笔记 第六天 开始学习DOM了。

    昨天学习了window对象的一些方法.window对象主要是针对当前视窗的操作.window对象提供了一些列API来帮助我们了解当前窗口的信息.例如history对象可以让我们获取浏览历史.nvaig ...

  2. 第六天实验详解——dedecms通过xss漏洞写马

    第六天实验详解 **XSS跨站攻击的分类** XSS漏洞类型主要分为持久型和非持久型两种: 1. 非持久型XSS漏洞一般存在于URL参数中,需要访问黑客构造好的特定URL才能触发漏洞. 2. 持久型X ...

  3. 关于DOM的操作以及性能优化问题-重绘重排

     写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...

  4. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  5. 页面嵌入dom与被嵌入iframe的攻防

    1.情景一:自己的页面被引入(嵌入)至别人的页面iframe中 if(window.self != window.top){ //url是自己页面的url window.top.location.hr ...

  6. 通俗易懂的来讲讲DOM

    DOM是所有前端开发每天打交道的东西,但是随着jQuery等库的出现,大大简化了DOM操作,导致大家慢慢的“遗忘”了它的本来面貌.不过,要想深入学习前端知识,对DOM的了解是不可或缺的,所以本文力图系 ...

  7. HTML DOM 介绍

    本篇主要介绍DOM内容.DOM 节点.节点属性以及获取HTML元素的方法. 目录 1. 介绍 DOM:介绍DOM,以及对DOM分类和功能的说明. 2. DOM 节点:介绍DOM节点分类和节点层次. 3 ...

  8. HTML DOM 对象

    本篇主要介绍HTML DOM 对象:Document.Element.Attr.Event等4个对象. 目录 1. Document 对象:表示文档树的根节点,大部分属性和方法都是对元素进行操作. 2 ...

  9. 重撸js_2_基础dom操作

    1.node 方法 返回 含义 nodeName String 获取节点名称 nodeType Number 获取节点类型 nodeValue String 节点的值(注意:文本也是节点) 2.inn ...

随机推荐

  1. 使用docker toolbox 在windows上搭建统一环境

    1.先下载docker toolbox 以下是下载地址: http://get.daocloud.io/#install-docker-for-mac-windows 2.下载安装 git windo ...

  2. 【转】安全传输协议SSL和TLS及WTLS的原理

    一.首先要澄清一下名字的混淆 1.SSL(Secure Socket Layer)是Netscape公司设计的主要用于WEB的安全传输协议.这种协议在WEB上获得了广泛的应用. 2.IETF将SSL作 ...

  3. PHP的数组排序函数

    <?php class order{ /** * * 数组排序 * @param array $arr 例如: * array ( array ( 'deskId' => '460646' ...

  4. Android进程间通讯

    最近研究了一下Android进程间通讯,原来只是会用,但是只是会用是不行滴,就来研究一下. 刚开始看的时候,我的头是这么大,看了一夜的时候,头就变成这样了,,吓得宝宝赶紧上床休息了,. 先喝喝茶讲个故 ...

  5. 利用DOS批处理实现定时关机操作

    10月1放假回来,寝室晚上10:30就停电了,最无法让人理解的是第二天早上8:00才来电.原来晚上电脑都是不关机的,开着WiFi一直到天亮,可是现在不行了,电脑如果一直开着第二天早上起来电脑肯定没电, ...

  6. Javascript中call和apply的区别和用法

    JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别.其实就是更改对象的内部指针,即改变对象的this指向的内容.这在面向对象的js编程过程中有时是很有用的.call ...

  7. 实例讲解 SQL 注入攻击

    这是一篇讲解SQL注入的实例文章,一步一步跟着作者脚步探索如何注入成功,展现了一次完整的渗透流程,值得一读.翻译水平有限,见谅! 一位客户让我们针对只有他们企业员工和顾客能使用的企业内网进行渗透测试. ...

  8. Linux2 在Linux(CentOS)上配置SSH免登陆

    前言:      本文主要是我在安装hadoop之前,需要先配置SSH免登陆.通过网上搜索,发现不少类似的资料,但多少都有些小问题,所以结合自己的实践,记录在此,作为参考.如果能帮助到其他人,自然是更 ...

  9. 走向面试之数据库基础:一、你必知必会的SQL语句练习-Part 1

    本文是在Cat Qi的参考原帖的基础之上经本人一题一题练习后编辑而成,非原创,仅润色而已.另外,本文所列题目的解法并非只有一种,本文只是给出比较普通的一种而已,也希望各位园友能够自由发挥. 一.三点一 ...

  10. 七天学会ASP.NET MVC (六)——线程问题、异常处理、自定义URL

    本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系列文章 七天学会ASP.NET MVC ...