有关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"){ // 利用元素节点的特性
// ....
}
}
//最好的方法可以这么做
//如果元素对象内部标签名是一样的
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,那么就一定要注意一些陷阱,同时也要多花时间琢磨。
有关DOM的小总结的更多相关文章
- DOM的小练习,两个表格之间数据的移动
本次讲的是两个表格之间数据的移动,左边的表格移动到右边,并且左边表格移动内容消失. <head> <meta http-equiv="Content-Type" ...
- HTMO DOM部分---小练习;列表之间移动、日期选择、好友选中、滑动效果、滚动条效果、飞入飞出效果。
一:列表之间数据移动 第一个列表里面有内容,第二个里面没有 实现功能: 点击左侧列表选中一项内容,点击按钮,复制到右侧 点击复制所有按钮,将左侧列表所有数据,复制到右侧 扩展功能:右侧列表实现去重复 ...
- jQuery的DOM操作小案例
案例一:下拉列表左右选择 <body> <div> <select style="width:60px" multiple size="10 ...
- JavaScript DOM编程艺术-学习笔记(第三章、第四章)
第三章: 1.js的对象分为三种:①用户自定义对象 ② 内建对象(js提供的对象) ③宿主对象(js寄宿的环境-浏览器,提供的对象) 2.文档是由节点组成的集合,即dom树,html元素是根元素,是唯 ...
- 微信小程序爬坑日记
新公司上手小程序.30天,从入门到现在,还没放弃... 虽然小程序发布出来快一年了,爬坑的兄弟们大多把坑都踩平了.而我一直停留在"Hello World"的学习阶段.一来没项目,只 ...
- php xml DOM编码
PHP XML文件编程 一.PHP DOM编程 <?php //1.创建dom对象 $xmldoc=new DOMDocument(); //2.加载xml(指定对哪个xml文件进行操作) $x ...
- 如何使用微信小程序制作banner轮播图?
在前端工程师的工作中,banner是必不可少的,那缺少了DOM的小程序是如何实现banner图的呢?如同其他的框架封装了不同的banner图的方法,小程序也封装了banner的方法,来让我一一道来: ...
- XML解析的二种方法之dom解析
XML解析的二种方法:dom解析和sax解析 文件大小 存储位置 读取速度 dom解析 小文件 放在内存中 快 sax解析 ...
- 从微信小程序开发者工具源码看实现原理(一)- - 小程序架构设计
使用微信小程序开发已经很长时间了,对小程序开发已经相当熟练了:但是作为一名对技术有追求的前端开发,仅仅熟练掌握小程序的开发感觉还是不够的,我们应该更进一步的去理解其背后实现的原理以及对应的考量,这可能 ...
随机推荐
- DBNull与Null
DBNull与Null的区别在于,DBNull代表该字段在数据库中根本不存在,Null代表该字段在数据库中没有值.
- js中push()方法
直接上代码: var roleIdsTemp = []; $("#addRole .modalcheckbox-all").each(function(key, value) { ...
- 带参数的查询防止SQL注入攻击
把单引号替换成两个单引号,虽然能起到一定的防止SQL注入攻击的作用,但是更为有效的办法是把要拼接的内容做成“参数” SQLCommand支持带参数的查询,也就是说,可以在查询语句中指定参数: 参数的设 ...
- java中Map的用法(HaspMap用法)
public interface Map<K,V> 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. import java.util.HashMap; impo ...
- Java-jfree报表(学习整理)----饼状图、柱状图、折线统计图
1.使用的报表工具: jfree报表 2.下载网址: http://www.jfree.org/ 下载之后先解压:如下图 下载后:需要的jar包!如下图: 打开:找到以下的两个jar包 再导入开发项目 ...
- POJ 1936 All in All(模拟)
All in All 题目链接:http://poj.org/problem?id=1936 题目大意:判断从字符串s2中能否找到子串s1.字符串长度为10W. Sample Input sequen ...
- Lua与C/C++交互问题
初学lua,遇到注册C/C++交互函数问题 在lua与C/C++交互时,C/C++的注册Lua函数若是一个有返回类型(压栈)而不是获取类型的时候应该返回1而不是返回0,否则会出现在Lua中值为nil( ...
- 171. Excel Sheet Column Number(C++)
171. Excel Sheet Column Number Related to question Excel Sheet Column Title Given a column title as ...
- 总结javascript继承的两种方式的N中写法
最近翻看博客园,总结了一下javascript的继承方式:prototype和copy继承方式. 一.prototype方式 当一个函数被创建时,Function构造函数产生的函数会隐式的被赋予一个p ...
- curl批处理从官方demo封装
官方demo // 创建一对cURL资源 $ch1 = curl_init(); $ch2 = curl_init(); // 设置URL和相应的选项 curl_setopt($ch1, CURLOP ...