`
li-yuan
  • 浏览: 66266 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

为公司内部培训整理的JavaScript DOM教程

阅读更多
   分为两个部分,首先是从mozilla网站上找的使用Javascript和DOM Interfaces来处理HTML然后是对dom对象和方法一个归纳总结

简介

本文概述了一些强大的,基本的DOM 级别一中的法以及如何在JavaScript中使用它们。你将会学习到如何动态地创建,访问,控制以及移除HTML元素。这里提到的DOM方法,并非是 HTML专有的;它们在XML中同样适用。这里所有的示例,在任何全面支持DOM level1 的浏览器里都能正常工作;例如Mozilla浏览器或者其他基于Mozilla的浏览器。这里的示例代码在IE5中也能正常工作。

这里所提到的DOM方法是第一级文档对象模型定义的核心的一部分。DOM 级别一包括对文档进行访问和处理的方法(DOM 1 核心)和专门为HTML文档定义的方法。

Sample1.html概览

这段文字是通过一个实例代码来介绍了DOM的。那么我们从下面的HTML示例来开始吧。这段示例使用了DOM 级别一的方法,从JavaScript动态创建了一个HTML表格。它创建了一个包含了四个单元的小表格,并且在每个单元中含有文本。单元中文字内容是 “这个单元式y行x列”,来展示单元格在表格中所处的位置。

<head>
<title>样例代码 - 使用 JavaScript 和 DOM 接口创建一个 HTML 表格</title>
<script>
function start() {
// 获得从body的引用
var mybody=document.getElementsByTagName("body").item(0);
// 创建一个TABLE的元素
mytable = document.createElement("TABLE");
// 创建一个TBODY的元素
mytablebody = document.createElement("TBODY");
// 创建所有的单元格
for(j=0;j<2;j++) {
// 创建一个TR元素
mycurrent_row=document.createElement("TR");
for(i=0;i<2;i++) {
// 创建一个TD元素
mycurrent_cell=document.createElement("TD");
// 创建一个文本(text)节点
currenttext=document.createTextNode("cell is row "+j+", column "+i);
// 将我们创建的这个文本节点添加在TD元素里
mycurrent_cell.appendChild(currenttext);
// 将TD元素添加在TR里
mycurrent_row.appendChild(mycurrent_cell);
}
// 将TR元素添加在TBODY里
mytablebody.appendChild(mycurrent_row);
}
// 将TBODY元素添加在TABLE里
mytable.appendChild(mytablebody);
// 将TABLE元素添加在BODY里
mybody.appendChild(mytable);
// 设置mytable的边界属性border为2
mytable.setAttribute("border","2");
}
</script>
</head>
<body onload="start()">
</body>
</html>

注意我们创建元素和文本节点的顺序:

  1. 首先我们创建了TABLE元素。
  2. 然后,我们创建了TABLE的子元素--TBODY。
  3. 然后,我们使用循环语句创建了TBODY的子元素--TR。
  4. 对于每一个TR元素,我们使用一个循环语句创建它的子元素--TD。
  5. 对于每一个TD元素,我们创建单元格内的文本节点。

现在,我们创建了TABLE,TBODY,TR,TD等元素,然后创建了文本节点;接下来,我们将每一个对象接在各自的父节点上,使用逆序:

  1. 首先,我们将每一个文本节点接在TD元素上
    mycurrent_cell.appendChild(currenttext);
    
  2. 然后,我们将每一个TD元素接在他的父TR元素上。
    mycurrent_row.appendChild(mycurrent_cell);
    
  3. 然后,我们将每一个TR元素接在他们的父TBODY元素上。
    mytablebody.appendChild(mycurrent_row);
    
  4. 下一步,我们将TBODY元素接在他的父TABLE元素上
    mytable.appendChild(mytablebody);
    
  5. 最后,我们将TABLE元素接在他的父元素BODY上。
    mybody.appendChild(mytable);
    

请记住这个机制。你将会在W3C DOM编程中经常使用它。首先,你从上到下的创建元素;然后你从下向上的将子元素接在他们的父元素上。

下面是由javascript代码生成的HTML代码:

...
<TABLE border=5>
<tr><td>cell is row 0 column 0</td><td>cell is row 0 column 1</td></tr>
<tr><td>cell is row 1 column 0</td><td>cell is row 1 column 1</td></tr>
</TABLE>
...

下面是由代码生成的TABLE及其子元素的DOM对象树:

Image:sample1-tabledom.jpg

你可以只用一些DOM方法来创建这个表格和它内部的子元素。请在脑海中时刻保留你想要创建的数据结构的树之模型,这样有利于更简便的写出必 须的代码。在图1的TABLE树中,TABLE有一个子元素TBODY。TBODY有两个子元素。每一个TR又含有一个子元素(TD)。最后,每一个TD 有一个子元素--文本节点。

基本DOM方法 - Sample2.html

getElementByTagName是文档接口(Document interface)和元素接口(Element interface)的中的方法,所以不管是根文档对象还是所有的元素对象都含有方法getElementByTagName。用来通过它们的标签名称(tag name)来获得某些元素的一系列子元素。你可以使用的方法是:element.getElementsByTagName(tagname)

getElementsByTagName返回一个有特定标签名称(tagname)的子元素列表。从这个子元素列表中,你可以通过调用item和你想得到的元素的下标,来获得单个元素。列表中第一个元素的下标是0。上面的方法很简单,但是当你操作一个巨大的数据结构时还是应该小心一些。 OK,我们下一个话题中要继续对我们的表格例子进行修改。下面的示例更加简单,它意图展示一些基础的方法:

<html>
<head>
<title>样例代码 - 使用 JavaScript 和 DOM 接口操作 HTML 表格</title>
<script>
function start() {
// 获得所有的body元素列表(在这里将只有一个)
myDocumentElements=document.getElementsByTagName("body");
// 我们所需要body元素是这个列表的第一个元素
myBody=myDocumentElements.item(0);
// 现在,让我们获得body的子元素中所有的p元素
myBodyElements=myBody.getElementsByTagName("p");
// 我们所需要的是这个列表中的第二个单元元素
myP=myBodyElements.item(1);
}
</script>
</head>
<body onload="start()">
<p>hi</p>
<p>hello</p>
</body>
</html>

在这个例子中,我们设置变量myP指向DOM对象body中的第二个p元素:

  1. 首先,我们使用下面的代码获得所有的body元素的列表,因为在任何合法的HTML文档中都只有一个body元素,所以这个列表是只包含一个单元的。
    document.getElementsByTagName("body")
    
  2. 下一步,我们取得列表的第一个元素,它本身就会body元素对象。
    myBody=myDocumentElements.item(0);
    
  3. 然后,我们通过下面代码获得body的子元素中所有的p元素
    myBodyElements=myBody.getElementsByTagName("p");
    
  4. 最后,我们从列表中取第二个单元元素。
    myP=myBodyElements.item(1);
    

Image:sample2a2.jpg

一旦你取得了HTML元素的DOM对象,你就可以设置它的属性了。比如,如果你希望设置背景色属性,你只需要添加:

myP.style.background="rgb(255,0,0)";
// 设置inline的背景色风格

使用document.createTextNode(..)创建文本节点

使用文档对象来调用一个createTextNode方法并创建你自己的文本节点。你只需要传递文字内容给这个函数。返回的值就是一个展示那个文本节点信息的对象。

myTextNode=document.createTextNode("world");

这表示你已经创建了一个TEXT——NODE(一个文字片断)类型的节点,并且它的内容是“world”,任何你对myTextNode的引用都指向这个节点对象。如果想将这个文本插入到HTML页面中,你还需要将它作为其他节点元素的子元素。

使用appendChild(..)插入元素

那么,通过调用myP.appendChild([node_element])你可以将这个元素设置成为第二个P的一个新的子元素。

myP.appendChild(myTextNode);

在测试了这个例子之后,我们注意到,hello和world单词被组合在了一个:helloworld。事实上,当你看到HTML页面时, hello和world两个文字节点看起来更像是一个节点。但是请记住它们在文档模型中的形式--是两个节点。第二个节点是一个TEXT_NODE类型的 新节点,也是第二个P标签的第二个子元素。下面的图标将在文档树种展示最近创建的文本节点对象。

Image:sample2b2.jpg

createTextNode 和 appendChild 是在单词hello和world之间设置空格的一个简单方法。另外一个重要的注意事项是:appendChild方法将把新的子节点接在最后一个子节点之 后,正如world被加在了hello之后。所以如果你想在hello和world中间添加一个文本节点的话,你应该使用insertBefore来提到 appendChild.

使用文档对象和createElement(..)方法创建新的元素

你可以使用createElement来创建新的HTML元素或者任何其它你想要的元素。比如,如果你想要创建一个新的P作为BODY的子元素,你可以使用前面例子的myBody并给它接上一个新的元素节点。使用 document.createElement("tagname")可以方便的创建一个节点。如下:

myNewPTAGnode=document.createElement("p");
myBody.appendChild(myNewPTAGnode);

Image:sample2c.jpg

使用removeChild(..)方法移除节点

每一个节点都可以被移除.下面的一行代码移除了包含在myP(第二个p元素)下面的文本节点world。

myP.removeChild(myTextNode);

最后你可以将myTextNode(那个包含了world单词的节点)添加给我们最后创建的P元素:

myNewPTAGnode.appendChild(myTextNode);

被修改的对象树的最后的状态如下:

Image:sample2d.jpg

动态创建一个表格(回到Sample1.html)

这一段落的剩余部分我们将继续修改我们sample1.html。下面的图展示了我们在示例中创建的表格的对象树的结构。

复习一下HTML表格结构

Image:sample1-tabledom.jpg

创建元素节点并将他们插入到文档树中

sample1.html中创建表格的基本步骤是:

  • 获得body对象(文档对象的第一个元素)
  • 创建所有元素。
  • 最后,根据表格结构(上面图中所示)将每一个孩子节点拼接起来。下面的一段源码是经过修改的sample1.html
在start函数的最后,有一行新代码。使用另一个DOM方法(setAttribute)来设置表格的边界属性。setAttribute有两个参数:属性的名称和属性的值。你可以使用这个方法来设置任意元素的任意属性。
<head>
<title>示例代码 - 使用Javascript和DOM Interfaces来处理HTML</title>
<script>
function start() {
// 获得body的引用
var mybody=document.getElementsByTagName("body").item(0);
// 创建一个标签名称为TABLE的元素
mytable = document.createElement("TABLE");
// 创建一个标签名称为在TBODY的元素
mytablebody = document.createElement("TBODY");
// 创建所有的单元格
for(j=0;j<2;j++) {
// 创建一个标签名称为在TR的元素
mycurrent_row=document.createElement("TR");
for(i=0;i<2;i++) {
// 创建一个标签名称为在TD的元素
mycurrent_cell=document.createElement("TD");
// 创建一个文字节点
currenttext=document.createTextNode("cell is row "+j+", column "+i);
// 将文字节点添加到TD单元格内
mycurrent_cell.appendChild(currenttext);
// 将TD单元格添加到TR行中
mycurrent_row.appendChild(mycurrent_cell);
}
// 将TR行添加到TBODY中
mytablebody.appendChild(mycurrent_row);
}
// 将TBODY添加到TABLE中
mytable.appendChild(mytablebody);
// 将TABLE添加到BODY中
mybody.appendChild(mytable);
// 设置边界属性为2
mytable.setAttribute("border","2");
}
</script>
</head>
<body onload="start()">
</body>
</html>

使用CSS和DOM来操作表格

从表格中获得一个文字节点

示例介绍了两个新的DOM属性。首先,使用childNodes属性来获得mycel的孩子节点列表。childNodes列表包括所有的孩子节 点,无论它们的名称或类型是什么。像getElemengByTagName一样,它返回了一个节点列表。不同的是, getElementByTagName只返回指定标签名称的元素。一旦你获得了返回的列表,你可以使用item(x)方法来使用指定的元素。这个例子在 表格的第二行第二个单元格中的myceltext中保存了一个文字节点。然后,运行这个例子并观察结果,他创建了一个新的文字节点,这个文字节点的内容是 myceltext的值,并且将这个文字节点作为了BODY元素的一个孩子。

如果你的对象是一个文字节点,你可以使用data属性来回收(retrieve)节点的文字内容
mybody=document.getElementsByTagName("body").item(0);
mytable=mybody.getElementsByTagName("table").item(0);
mytablebody=mytable.getElementsByTagName("tbody").item(0);
myrow=mytablebody.getElementsByTagName("tr").item(1);
mycel=myrow.getElementsByTagName("td").item(1);
// mycel的孩子节点列表的第一个元素
myceltext=mycel.childNodes.item(0);
// currenttext的内容是myceltext的内容
currenttext=document.createTextNode(myceltext.data);
mybody.appendChild(currenttext);

获得一个属性的值

在sample1的最后我们在mytable对象上调用了setAttribute。这个调用是用来设置表格的边界属性的。然后是用了getAttribute方法来获得一个属性的值:

mytable.getAttribute("border");

通过改变样式属性来隐藏一列

一旦你在你的javascript变量中保存了一个对象,你就可以直接为它设置样式属性了。下面的代码是修改后的sample1.html,在这里,第二列的每一个单元格都被隐藏了。而且第一列中的每一个单元格改为使用红色背景。注意,样式属性是被直接设置的。

<html>
<body onload="start()">
</body>
<script>
function start() {
var mybody=document.getElementsByTagName("body").item(0);
mytable = document.createElement("TABLE");
mytablebody = document.createElement("TBODY");
for(j=0;j<2;j++) {
mycurrent_row=document.createElement("TR");
for(i=0;i<2;i++) {
mycurrent_cell=document.createElement("TD");
currenttext=document.createTextNode("cell is:"+i+j);
mycurrent_cell.appendChild(currenttext);
mycurrent_row.appendChild(mycurrent_cell);
// 当column为0时,设置单元格背景色;column为1时隐藏单元格
if(i==0) {
mycurrent_cell.style.background="rgb(255,0,0)";
} else {
mycurrent_cell.style.display="none";
}
}
mytablebody.appendChild(mycurrent_row);
}
mytable.appendChild(mytablebody);
mybody.appendChild(mytable);
}
</script>
</html>
分享到:
评论

相关推荐

    JavascriptDOM编程视频教程(17讲)

    教程名称:Javascript DOM编程视频教程(17讲) 课程目录:【】1.JavascriptDOM编程_在什么位置编写JS代码【】10.JavascriptDOM编程_删除节点【】11.JavascriptDOM编程_添加删除节点的实验...

    JavaScript DOM编程艺术.pdf

    JavaScript DOM编程艺术 --全

    经典之作javascript dom编程艺术源码

    经典之作《javascript dom编程艺术》源码。通过一个实际案例,讲述了原生的javascript操作dom的使用方法,以及操作dom中应该注意的一些事项。

    JavascriptDOM基本操作

    JavascriptDOM基本操作 dom 精品操作

    JavaScriptDOM编程艺术(第2版)PDF版本下载.txt

    JavaScriptDOM编程艺术(第2版)PDF版本下载

    javascript Dom 编程艺术

    本 书在简洁明快地讲述JavaScript和DOM的基本知识之后,通过几个实例演示了专业水准的网页开发技术,透彻阐述了平稳退化等一批至关重要的 JavaScript编程原则和最佳实践,并全面探讨了HTML5以及jQuery等JavaScript库...

    javascript_DOM操作

    javascript_DOM,javascript_DOM,javascript_DOM,javascript_DOM

    JavaScript DOM编程艺术(中文第2版)

    第1章 JavaScript简史 1.1 JavaScript的起源 1.2 DOM 1.3 浏览器战争 1.3.1 DHTML 1.3.2 浏览器之间的冲突 1.4 制定标准 1.4.1 浏览器以外的考虑 1.4.2 浏览器战争的结局 1.4.3 崭新的起点 1.5 小结 第2章 ...

    尚硅谷JavaScript DOM视频教程

    尚硅谷JavaScript DOM视频教程,仅供参考学习,有需要的可以下载,本人有全栈开发工程师各种学习技术视频教程及本档,有需要的可以留言或到本人账号下载

    JavaScript DOM编程艺术

    JavaScript DOM编程艺术 经典书籍

    javascript dom2 源码及pdf

    javascript dom2 源码及pdf

    JavaScript DOM编程艺术【第2版&高清】.pdf

    JavaScript DOM编程艺术,高清资源,无比经典,值得拥有

    javascript DOM 编程艺术

    从颇具深度的JavaScript语言基础到作用域(链),从引用类型到面向对象编程,从极其灵活的匿名函数到闭包的内部机制,从浏览器对象模型(BOM)、文档对象模型(DOM)到基于事件的Web脚本设计,从XML(E4X)到Ajax及JSON,从...

    JavaScriptDOM编程艺术.中文版.完整书签

    JavaScriptDOM编程艺术.中文版.完整书签  本书讲述了JavaScript和DOM的基础知识,但重点放在DOM编程技术背后的思路和原则:预留退路、循序渐进和以用户为中心等,这些概念对于任何前端Web开发工作都非常重要。本书...

    JavaScript之DOM教程

    一款简单的javascript DOM入门教程,适合新手,看一遍就应该可以做出简单的DOM运用了,而且很短

    JavascriptDOM编程视频教程

    教程名称:Javascript DOM编程视频教程 课程目录:【】Javascript5_DOM编程01【】Javascript5_DOM编程02【】Javascript5_DOM编程03【】Javascript5_DOM编程04【】Javascript5_...

    JavaScriptDom编程艺术

    JavaScriptDom编程艺术,一本很好的前端书籍,有兴趣的可以看看

    JavaScriptDOM高级程序设计

    资源名称:JavaScript DOM高级程序设计内容简介:本书注重理论与实践的结合,全面讲述高级的DOM 脚本编程。全书分为3 个部分:第一部分“深入理解DOM 脚本编程”,涉及W3C DOM 规范的各方面,包括非标准的浏览器支持...

    JavaScript DOM 高级程序设计

    本书注重理论与实践的结合,全面讲述高级的DOM脚本编程。全书分为3个部分:第一部分“深入理解DOM脚本编程”,涉及W3CDOM规范的各方面,包括非标准的浏览器支持和不支持的内容;第二部分“浏览器外部通信”,以Ajax...

    JavaScript Dom编程艺术

    JavaScript Dom编程艺术JavaScript Dom编程艺术JavaScript Dom编程艺术JavaScript Dom编程艺术JavaScript Dom编程艺术JavaScript Dom编程艺术JavaScript Dom编程艺术

Global site tag (gtag.js) - Google Analytics