JavaScript DOM学习第一章 W3C DOM简介


Posted in Javascript onFebruary 19, 2010

在这一章我主要介绍已经被新一代的浏览器所支持的W3C 第一级的DOM。对他的运作做一个大概的了解并且让你知道你可以对他们做什么。
首先是对于DOM的一些建议和DOM设计的目的,然后我会告诉你什么是节点(nodes)并且怎样通过DOM树来遍历节点。接着是如何得到一个特定的节点,以及怎样改变他的值和属性。最后就是DOM的终极目标:怎么创建一个自己的新节点。
建议
Level 1DOM是W3C制定的用来提供给任何程序语言来访问XML文档的。不管你用什么语言程序来处理XML文档,只要是Level 1DOM里面的方法和属性就可以。不管是Perl、VBScript还是JavaScript你都可以读取任何你想读取的值并且修改他们。
你们可能会猜到,这段描述的是一种理想情况,差异还是存在的(比如浏览器)。然后这部分内容还是比较少,并且你在JavaScript里学习如何处理XML也对你在其它语言中的学习会有一定的帮助。
从某种程度上也可以讲HTML看做是一种XML文档。只要浏览器能够处理相应的脚本,那么Level 1 DOM也同样在HTML里面可以运行的很好。
你可以读取每一个HTML的标签的文本和属性,你可以删除每一个标签和他们的内容,你还可以实时的在现有的文档里面插入一个新的标签而不用在服务器上修改。
因为设计之初要考虑到修改XML的方方面面,所以对于一般的网页工程师来说有一些方法可能永远也用不上。比如,你可以用它来修改HTML的注释,但是我没有看出来问什么要这样做。同样的还有一些DOM处理DTD/Doctype的内容,你在你的网页设计中并不需要,所以忽略掉,集中注意力在你的日常所需上就好。
节点(Nodes)
文档对象模型是一种文档内的多个元素之间怎样相互联系的一种模型。在Level 1 DOM中,每一个对象都是一个节点。所以如果你写:

<p>This is a paragraph</p>

那么你就创建了两个节点:元素P和内容是"This is a paragraph”的文本节点。这个文本节点包含在P元素内,所以可以认为是p节点的子节点。反过来说,p元素就是文本节点的父节点。
如果你写成:
<p>This is a <B>Paragraph</B></p>

那么元素节点p就有两个子节点,其中一个还有他自己的子节点。
最后就是参数节点。(令人困惑的是,他们不算做元素节点的子节点。事实上,在我写这一章的过程中我做过一些测试,IE5根本就不把参数节点当做元素的子节点。)所以:
<P ALIGN="right">This is a <B>paragraph</B></P>

的结构可能是这样的:

<P> ----------------     --------------     ALIGN
  This is a     <B>     |
            |    right
          paragraph

这就是元素节点,文本节点和参数节点。99%的HTML页面都是由他们组成,你的主要任务也就是如何放置他们。当然还有很多的其他节点,暂且略过。

就像你所了解的,p元素也有他自己的父节点,通常就是document,有时候也可能是一个DIV。所以整个文档都可以看做是一颗由很多的节点组成的树,而且这些节点大多都有自己的子节点。

<BODY>        |-------------------------------------
       <P> ----------------      lots more nodes
     --------------     ALIGN
  This is a     <B>     |
            |    right
          paragraph

遍历DOM树
知道了DOM树的结构,你就可以遍历他来找到你想要的元素。举个例子,假设元素节点p已经存储在变量x中(等一会介绍这是怎么做到的)。这时候如果我们想访问BODY那么:
x.parentNode

我们就得到了x的父元素,然后就可以修改它了。这样可以到达B节点:
x.childNode[1]

childNode是一个包含所有x的子节点的数组。当然,数组是从0开始编号的,所以childNode[0]就是文本节点"This is a " childNode[1]就是B节点。
两个特别的:x.firstChild就表示x的第一个子节点;x.lastChild就表示x的最后一个子节点。
假设p是BODY的第一个子节点,BODY又是document的第一个子节点,所以为了到达B节点,你可以用下面的任意方法:
document.firstChild.firstChild.lastChild; 
document.firstChild.childNodes[0].lastChild; 
document.firstChild.childNodes[0].childNodes[1];

甚至是下面这个比较笨的:
document.firstChild.childNodes[0].parentNode.firstChild.childNodes[1];

得到一个元素
然而,这样遍历文档实在是太麻烦了。因为Level 1 DOM设计的目标就是允许你修改整个DOM树,所以你必须准确的知道DOM树的结构,这会很快导致一些问题。
所以还有一些方法能够很快的到达你想要的元素。只要你到达了这里,就可以遍历整个DOM树的每一个节点。
让我们继续前面的例子。你想要到达元素B。最简单的办法就是直接跳过去。通过document.getElementByTagName你就能很快的创建一个包含文档内的所有B标签的数组。假设我们的B是第一个,那么你就可以简单的写:
var x = document.getElementsByTagName('B')[0]

x就包含了元素节点B。首先你命令浏览器得到整个文档的所有元素B(document.getElementByTagName(‘B')) ,然后你选择了第一个文档的第一个元素B([0]),就得到了你想要的。
你也可以写:
var x = document.getElementsByTagName('P')[0].lastChild;

现在你先到了文档的第一个段落P(假设我们的P是第一个元素),然后到达p的最后一个子元素。
最好的能准确到达元素并且不需要DOM结构的办法就是给B一个ID:
<P ALIGN="right">This is a <B ID="hereweare">paragraph</B></P>现在你就可以简单的写:
var x = document.getElementById('hereweare');

元素B就存储在了x里。
修改一个节点
现在我们已经到达了节点,就可以做一些修改了。假设我们想把加粗的文字部分修改为'bold bit of text'。我们需要访问正确的元素然后修改它的nodeValue。现在正确的元素不是元素B而是他的子元素text node:我们想改变的是文字,不是元素。所以可以写:
document.getElementById('hereweare').firstChild.nodeValue='bold bit of text';

元素就改变了。
你可以通过nodeValue来修改任何文本节点或者参数。比如你可以修改段落的ALIGN参数。这也是非常的简单,先找到需要的元素(在这个例子中是B元素的父元素),然后使用setAttribute()方法来设置你想要的值:
function test2(val) { 
if (document.getElementById && document.createElement) 
{ 
node = document.getElementById('hereweare').parentNode; 
node.setAttribute('align',val); 
} 
else alert('Your browser doesn\'t support the Level 1 DOM'); 
}

创建和删除元素
修改元素固然有用,但是还是不如创建你需要的元素然后插入到现有的文档中。我可以很简单的在这个段落后面添加一个HR元素然后很简单的删除它。
创建元素使用下面的方法:
var x=document.createElemnt(‘HR')
这样HR就创建并且存储在x中。第二步就是把x插入到文档之中。我写了一个ID是inserthere的SPAN,我们就把它插入到这。所以我们使用appendChild()方法:
document.getElementById('inserthrhere').appendChild(x);

删除它稍稍有点麻烦。我先创建一个临时变量node来存储SPAN,然后我告诉他移除他的第一个子元素:
var node=document.getElementById(‘inserthere'); 
node.removeChild(node.childNode[0]);

同样的方法我们也可以创建一个新的元素然后添加在ID是hereweare的B元素上。

var x = document.createTextNode(' A new text node has been appended!'); 
document.getElementById('hereweare').appendChild(x);

你可以试一试,你会注意到用老的办法可能不会移除新加的文本,那是因为他们已经成为分离的两部分了:
<B> ------------
 paragraph A new text node
 has been appended!

(可以通过normalize()来把他们合并,但是IE5不支持)

我不打算告诉你怎么移除它,自己练习会比较有收获

翻译地址:http://www.quirksmode.org/dom/intro.html

转载请保留以下信息
作者:北玉(tw:@rehawk)

Javascript 相关文章推荐
Ruffy javascript 学习笔记
Nov 30 Javascript
js操作iframe的一些方法介绍
Jun 25 Javascript
GRID拖拽行的实例代码
Jul 18 Javascript
js中AppendChild与insertBefore的用法详细解析
Dec 16 Javascript
JavaScript生成随机数的4种自定义函数分享
Feb 28 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
Mar 11 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
Apr 06 Javascript
jQuery动态星级评分效果实现方法
Aug 06 Javascript
浅谈JS之iframe中的窗口
Sep 13 Javascript
Vue2.0如何发布项目实战
Jul 27 Javascript
VueJs 搭建Axios接口请求工具
Nov 20 Javascript
纯js+css实现在线时钟
Aug 18 Javascript
JavaScript 题型问答有答案参考
Feb 17 #Javascript
JavaScript 学习技巧
Feb 17 #Javascript
JavaScript Timer实现代码
Feb 17 #Javascript
两个比较有用的Javascript工具函数代码
Feb 17 #Javascript
类似GMAIL的Ajax信息反馈显示
Feb 16 #Javascript
JavaScript 10件让人费解的事情
Feb 15 #Javascript
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
Feb 15 #Javascript
You might like
PHP分页显示制作详细讲解
2006/10/09 PHP
PHP学习 变量使用总结
2011/03/24 PHP
php session_start()出错原因分析及解决方法
2013/10/28 PHP
PHP实现定时执行任务的方法
2014/10/05 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
PHP7新增运算符用法实例分析
2016/09/26 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
Laravel学习教程之request validation的编写
2017/10/25 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
修复IE9&amp;safari 的sort方法
2011/10/21 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
2013/06/27 Javascript
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
2014/06/23 Javascript
Jquery修改页面标题title其它JS失效的解决方法
2014/10/31 Javascript
JQuery中基础过滤选择器用法实例分析
2015/05/18 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
2016/03/18 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
vue中实现左右联动的效果
2018/06/22 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
2019/04/29 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
教你使用Canvas处理图片的方法
2017/11/28 HTML / CSS
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
学生实习推荐信范文
2013/11/26 职场文书
九年级体育教学反思
2014/01/23 职场文书
学前班学生评语
2014/12/29 职场文书
基层党建工作简报
2015/07/21 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python