javascript DOM的详解及实例代码

javascript DOM 总结

一直以为DOM(文档对象模型)是JS中最简单的一部分。不可否认,它确实很简单,因为DOM的思维模式有点固定,只需要简单地记住一些固定的方法,所以DOM可以说是所有js(这里指的是客户端的js)入门的起手点。

  最近我在做一些有用到DOM的练习时,发现自己的DOM知识非常零散(一直以为掌握的很好),可能有很多朋友都觉得,DOM嘛,也就调用调用几个方法,或者我直接使用jQuery,根本不用考虑DOM的细节。是,这也没错,jQuery对DOM的封装可谓前无古人,但是正如成长一样,跑之前是一定要会走的,所以我认为对DOM必须要有比较详细的了解,于是我总结了如下的关于DOM的一些使用方法。

  在W3C总结跪DOM规范中,有一些十分常用的,也有些不怎么有用的,这里我们主要讨论常用一些DOM操作(有关DOM的基本概念在此就不介绍了):

  节点层次

  所谓节点层次,指的是html文档中存在具有各自特点,数据,方法的节点(例如标签),节点之间的关系构成了层次(其实可以想象成树状结构)。W3C的DOM1级规范中定义了一个NODE接口。这个接口有一些方法是非常有用的:

  Node.ELEMENT_NODE;(元素节点)

  Node.TEXT_NODE;(文本节点)

  Node.DOCUMENT_NODE(文档节点)

  而每个节点都有自己的节点类型标志,也就是NodeType属性,例如元素节点的nodeType == '1';文本节点的nodeType == '3';文档节点的nodeType == '9';

  1.文档节点

    文档节点在一个文档中用document对象表示,它的基本特征如下:

console.log(document.nodeType); // 9
console.log(document.nodeName); // #document
console.log(document.nodeValue); // null
console.log(document.parentNode); // null(它已经是最顶层的节点,树的根节点)

  tip one (文档的子节点):

    1.document.documentElement可以取到html对象,同样可以通过document.childNodes[0]以及document.firstchild取到。然而 documentElement可以更快,更直接访问元素。

  tip two (文档的相关信息):

    1.取得文档标题 : document.title;

    2.取得完整的url : document.URL;

    3.取得域名(ip) : document.domain;

    4.取得页面的URL : document.referrer;

  tip three (文档查找元素):

    1.通过id : document.getElementById("xxx");  一般页面id会不同,若有多个相同id,则取到第一个有该id的元素。

    2.通过tagName : document.getElementsByTagName("xxx"); 返回标签名为"xxx"的元素集合!

    3.通过name : document.getElementByName();

  理解document对象非常简单,兼容性做的也比较靠前。

  2.元素节点

  元素节点提供了对元素标签名,子节点及特性的访问。它的基本特征如下:

var ele = document.getElementById("element"); //通过document取到一个标签对象
console.log(ele.nodeType); // 1
console.log(ele.nodeName); // 返回元素的标签名
console.log(ele.nodeValue); //永远返回null!

  tip one (html元素) :

    <div id="myDiv" class="bd" title="Body text" lang="en" dir="ltr"></div>

    var div = document.getElementById("div");

    1. console.log(div.id); // "myDiv"

    2. console.log(div.className); // "bd"

    3. console.log(div.title); // "Body text"

    4. console.log(div.lang); // "en"

    5. console.log(div.dir); // "ltr"

 tip two (取得,设置和删除特性):

    1.div.getAttribute("id"); // "myDiv"

    2.div.setAttribuye("id","yourDiv"); // id已变动

    3.div.removeAttribute("id"); //id已删除

    需要注意:  在IE7及以下的版本中,三种方法存在着一些异常行为,通过set设置class 和style特性,特别是事件处理程序时,没有任何效果,get也是同样的。因此一般开发要避免以上三种方法,推荐通过属性来设置特性。

 tip three (元素的子节点) :

    要重点提一下的就是这里了,有如下代码:

<ul id="myList">
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
</ul> 

var mL = document.getElementById("myList");
//很明显mL对象有三个元素节点,我们也知道用childNodes属性去找到节点数,然而陷阱随之而来 

console.log(mL.childNodes); // 7
//?!怎么会有7个? 

//原因在于childNodes中不仅包含了元素节点,还有4个文本节点。因此需要过滤 

for(var i=0,len=ml.childNodes.length;i<len;i++){
   if(ml.childNodes[i].nodeType == "1"){ // 利用元素节点的特性
     // ....
   }
}<br>//最好的方法可以这么做<br>//如果元素对象内部标签名是一样的<br>var items = ml.getElementsByTagName("li"); //能得到三个li节点对象
  

 3.文本节点

  文本节点包含的是可以照字面解释的纯文本内容,纯文本中可以包含转义后的HTML字符,但不能包含HTML代码。文本节点的基本特征如下:

<div id="myDiv">123</div> 

var myDiv = document.getElementById("myDiv") //取到元素节点
var tx = myDiv.childNodes[0] //前面也提过childNodes的特性,这次取到了文本节点 

console.log(tx.nodeType) // 3
console.log(tx.nodeName) // 所有文本节点的nodeName都是"#text";
console.log(tx.nodeValue) // 123(节点包含的文本),注意元素节点是不能取到它包含的文本节点的文本的 

//所以其父节点显然是个元素节点.

 Tip one :

    创建文本节点的两个方法:document.createTextNode(),document.createText();

    创建好后不会直接嵌入文档中,需要引用。

var a = document.createElement("p");

    var b = document.createTextNode("123");

    a.appendChild(b);

    document.body.appendChild(a);

    这样在body末尾会出现<p>123</p>这样的标签

  个人认为DOM肯定是学习js的入门点,但是也需要很长时间的打磨。我看了DOM不少于三遍,仅仅是DOM1级规范,每次都有些新东西。如果你学习DOM,那么就一定要注意一些陷阱,同时也要多花时间琢磨。 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • js常用DOM方法详解

    介绍几个js DOM的常用方法 获取元素节点 getElementById    getElementsByTagName    getElementsByClassName 先写一个简单的网页做测试: /* test.html */ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>test</title> </head> <

  • js 数据存储和DOM编程

    数据存储 ·在javascript中,数据存储的位置会对代码整体性能产生重大的影响. ·数据存储共有4种方式:字面量.变量.数组.对象成员. ·要理解变量的访问速度,就要理解作用域.由于局部变量处于作用域的起始位置,因此访问速度比访问跨域作用域变量(即除起始位置之外的外层作用域变量)更快.即变量处在作用域的位置越深,访问速度越慢.这也就说明,访问全局变量的速度是最慢的. 总的来说,字面量和局部变量的访问速度快于数组和对象成员的访问速度. 因此,常见的一些提高数据访问速度的方法有: ①避免使用wi

  • 详解Javascript中DOM的范围

    前言 为了让开发人员更方便地控制页面,DOM定义了"范围"(range)接口.通过范围可以选择文档中的一个区域,而不必考虑节点的界限(选择在后台完成,对用户是不可见的).在常规的DOM操作不能更有效地修改文挡时,使用范围往往可以达到目的.本文将详细介绍DOM范围,下面来一起看看吧. 创建范围 Document类型中定义了createRange()方法.在兼容DOM的浏览器中,这个方法属于document对象.使用hasFeature()或者直接检测该方法,都可以确定浏览器是否支持范围

  • javascript事件捕获机制【深入分析IE和DOM中的事件模型】

    本文实例分析了javascript事件捕获机制.分享给大家供大家参考,具体如下: 1.什么是事件冒泡? 在排序算法中,我们学过冒泡排序法,所谓冒泡就是让底层的东西浮出水面,对于事件冒泡也同样是如此, 下面我们来看一个例子来说明什么是事件冒泡. <div> <button>测试</button> </div> <script> $("div").bind("click",function(){alert(&q

  • Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)

    本文实例总结了Javascript DOM事件操作.分享给大家供大家参考,具体如下: 使用JavaScript可以对HTML页面上的各种事件进行监听,如鼠标点击/释放,鼠标悬停/离开,等等. 效果图: 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> &l

  • 原生JS和jQuery操作DOM对比总结

    一.创建元素节点 1.1 原生JS创建元素节点 document.createElement("p"); 1.2 jQuery创建元素节点 $('<p></p>');` 二.创建并添加文本节点 2.1 原生JS创建文本节点 `document.createTextNode("Text Content"); 通常创建文本节点和创建元素节点配合使用,比如: var textEl = document.createTextNode("He

  • 原生JS实现几个常用DOM操作API实例

    原生实现jQuery的sibling方法 <body> <span>我是span标签</span> <div>我是一个div</div> <h1 id="h1">我是标题</h1> <p>我是一个段落</p> <script type="text/javascript"> //获取元素的兄弟节点 function siblings(o){//参数o

  • 如何用js判断dom是否有存在某class的值

    例如: <html class="no-js"> <head> </head> <body> </body> </html> 判断html节点的class是否有no-js. 1.jquery的实现方式 $("html").hasClass('no-js'); jquery源码的实现方式: var rclass = /[\t\r\n\f]/g; jQuery.fn.extend({ hasClas

  • JS访问DOM节点方法详解

    本文实例讲述了JS访问DOM节点方法.分享给大家供大家参考,具体如下: 查找并访问节点 你可通过若干种方法来查找您希望操作的元素: 通过使用 getElementById() 和 getElementsByTagName() 方法 通过使用一个元素节点的 parentNode.firstChild 以及 lastChild 属性 getElementById() 和 getElementsByTagName() getElementById() 和 getElementsByTagName()

  • javascript DOM的详解及实例代码

    javascript DOM 总结 一直以为DOM(文档对象模型)是JS中最简单的一部分.不可否认,它确实很简单,因为DOM的思维模式有点固定,只需要简单地记住一些固定的方法,所以DOM可以说是所有js(这里指的是客户端的js)入门的起手点. 最近我在做一些有用到DOM的练习时,发现自己的DOM知识非常零散(一直以为掌握的很好),可能有很多朋友都觉得,DOM嘛,也就调用调用几个方法,或者我直接使用jQuery,根本不用考虑DOM的细节.是,这也没错,jQuery对DOM的封装可谓前无古人,但是正

  • javascript 面向对象function详解及实例代码

    javascript 面向对象function详解     js中的函数有三种表示方式: //函数的第一种表示方式:函数关键字的方式 function f1() { alert("f1"); } //函数的第二种表示方式:函数字面量的方式 var f2 = function() { alert("f2"); } //函数的第三种表示方式:构造函数的方式 var f3 = new Function('var a = 100; b = 200; return a+b;'

  • JavaScript 栈的详解及实例代码

    JavaScript 栈 栈是一种遵从先进后出(LIFO)原则的有序集合. 新添加或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底. 在栈里,新元素都靠近栈顶,旧元素都接近栈底 昨天因为有点事没有更新,今天打算给大家讲讲JavaScript实现的数据结构 数据结构与算法是程序语言的灵魂,是解决一切编程问题的基础 以前学C/C++的时候,感觉算法还是非常重要的,但是前端涉及的并不多 不管怎样,作为技术人员,理解一些基本数据结构和算法应该是必须的 而且我们的JavaScript实现数据结构和

  • javascript replace()用法详解附实例代码

    replace()最简单的算是能力就是简单的字符替换.示例代码如下: var strM = "javascript is a good script language"; //在此我想将字母a替换成字母A alert(strM.replace("a","A")); [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 我想大家运行后可以看到结果,它只替换了首字母.但如果加上正则表达式结果就不一样了!呵呵,没错.replace()支持正则表达

  • JavaScript 闭包机制详解及实例代码

    首先要区分两个概念,一是匿名函数,一是闭包. 所谓匿名函数,就是创建函数没有给定函数名.经常出现的包括函数表达式,就是定义一个匿名函数,然后将函数赋值给某个变量,而此时这个变量就相当于该函数的函数名,例如: var sayHi = function(){ alert("Hi"); }; //注意这个分号 sayHi(); //调用函数 还有一种常用匿名函数的情况是回调函数,如 JQuery 中常用到的: $("p").click(function(){ alert(

  • JS 实现计算器详解及实例代码(一)

    Javascript 实现计算器: 系列文章: JS 实现计算器详解及实例代码(一) Javascript 实现计算器时间功能详解及实例(二) 小型JavaScript计算器 自己寻思出的解决方案,比较笨拙的方法,虽然完成了但是还有不少bug,用的方法也不是最有效的,基本功能算是完成了,一些小的细节地方也考虑到了,但是还有其他的细节需要处理. 总体设计思路是,先画草图 -> 设计UI -> 编写UI代码 -> 编写CSS -> 编写JS逻辑代码: 面板(main-board) 面板

  • MyBatis获取数据库自生成的主键Id详解及实例代码

    MyBatis获取数据库自生成的主键Id详解及实例代码 在使用MySQL数据库时我们一般使用数据库的自增主键自动产生主键.如果在插入主表时,我们需要同时插入从表的数据,这时我们通常需要知道主表插入时自动产生的主键Id值. 下面介绍使用MyBatis进行插入时,如何同时获取数据库自生成的主键: 1.XML配置文件 <insert id="insert" parameterType="Person" useGeneratedKeys="true"

  • MySQL 序列 AUTO_INCREMENT详解及实例代码

    MySQL 序列 AUTO_INCREMENT详解及实例代码 MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍如何使用MySQL的序列. 使用AUTO_INCREMENT MySQL中最简单使用序列的方法就是使用 MySQL AUTO_INCREMENT 来定义列. 实例 以下实例中创建了数据表insect, insect中id无需指定值可实现自动增长. mysql>

  • Java 两种延时thread和timer详解及实例代码

    Java 两种延时thread和timer详解及实例代码 在Java中有时候需要使程序暂停一点时间,称为延时.普通延时用Thread.sleep(int)方法,这很简单.它将当前线程挂起指定的毫秒数.如 try { Thread.currentThread().sleep(1000);//毫秒 } catch(Exception e){} 在这里需要解释一下线程沉睡的时间.sleep()方法并不能够让程序"严格"的沉睡指定的时间.例如当使用5000作为sleep()方法的参数时,线 程

  • Spring组件自动扫描详解及实例代码

    Spring组件自动扫描详解及实例代码 问题描述 一个系统往往有成千上万的组件,如果需要手动将所有组件都纳入spring容器中管理,是一个浩大的工程. 解决方案 Spring 提供组件扫描(component scanning)功能.它能从classpath里自动扫描.侦测和实例化具有特定注解的组件.基本的注解是@Component,它标识一个受Spring管理的组件.其他特定的注解有@Repository.@Service和@Controller,它们分别标识了持久层.服务处和表现层的组件.

随机推荐