第六章建立基于 DOM 的 Web 应用程序.doc
《第六章建立基于 DOM 的 Web 应用程序.doc》由会员分享,可在线阅读,更多相关《第六章建立基于 DOM 的 Web 应用程序.doc(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、本系列的上一篇文章中考察了文档对象模型(DOM)编程中涉及到的概念Web 浏览器如何把网页看作一棵树,现在您应该理解了 DOM 中使用的编程结构。本期教程将把这些知识用于实践,建立一个简单的包含一些特殊效果的 Web 页面,所有这些都使用 JavaScript 操纵 DOM 来创建,不需要重新加载或者刷新页面。前面两期文章已经详细介绍了文档对象模型或者 DOM,读者应该很清楚 DOM 是如何工作的了。(前两期 DOM 文章以及 Ajax 系列更早文章的链接请参阅参考资料。)本教程中将把这些知识用于实践。我们将开发一个简单的 Web 应用程序,其用户界面可根据用户动作改变,当然要使用 DOM 来
2、处理界面的改变。阅读完本文之后,就已经把学习到的关于 DOM 的技术和概念付诸应用了。假设读者已经阅读过上两期文章,如果还没有的话,请先看一看,切实掌握什么是 DOM 以及 Web 浏览器如何将提供给它的 HTML 和 CSS 转化成单个表示网页的树状结构。到目前为止我一直在讨论的所有 DOM 原理都将在本教程中用于创建一个能工作的(虽然有点简单)基于 DOM 的动态 Web 页面。如果遇到不懂的地方,可以随时停下来复习一下前面的两期文章然后再回来。从一个示例应用程序开始关于代码的说明为了把注意力集中到 DOM 和 JavaScript 代码上,我编写 HTML 的时候有些随意地采用内联样式(
3、比如 h1 和 p 元素的 align 属性)。虽然对实验来说这样做是可接受的,但是对于开发的任何产品应用程序,我建议花点时间把所有的样式都放到外部 CSS 样式表中。我们首先建立一个非常简单的应用程序,然后再添加一点 DOM 魔法。要记住,DOM 可以移动网页中的任何东西而不需要提交表单,因此足以和 Ajax 媲美;我们创建一个简单的网页,上面只显示一个普通的旧式大礼帽,还有一个标记为 Hocus Pocus! 的按钮(猜猜这是干什么的?)初始 HTML清单 1 显示了这个网页的 HTML。除了标题和表单外,只有一个简单的图片和可以点击的按钮。清单 1. 示例应用程序的 HTML Magic
4、 Hat Welcome to the DOM Magic Shop! 可以在本文后面的下载中找到这段 HTML 和本文中用到的图片。不过我强烈建议您只下载那个图片,然后随着本文中逐渐建立这个应用程序自己动手输入代码。这样要比读读本文然后直接打开完成的应用程序能够更好地理解 DOM 代码。查看示例网页这里没有什么特别的窍门,打开网页可以看到图 1 所示的结果。图 1. 难看的大礼帽关于 HTML 的补充说明应该 注意的重要一点是,清单 1 和图 1 中按钮的类型是 button 而不是提交按钮。如果使用提交按钮,单击该按钮将导致浏览器提交表单,当然表单没有 action 属性(完全是有意如此)
5、,从而会造成没有任何动作的无限循环。(应该自己试试,看看会发生什么。)通过使用一般输入按钮而不是提交按钮,可以把 javaScript 函数和它连接起来与浏览器交互而无需 提交表单。回页首向示例应用程序添加元素现在用一些 JavaScript、DOM 操作和小小的图片戏法装扮一下网页。使用 getElementById() 函数显然,魔法帽子没有兔子就没有看头了。这里首先用兔子的图片替换页面中原有的图片(再看看图 1),如图 2 所示。 图 2. 同样的礼帽,这一次有了兔子完成这个 DOM 小戏法的第一步是找到网页中表示 img 元素的 DOM 节点。一般来说,最简单的办法是用 getElem
6、entById() 方法,它属于代表 Web 页面的 document 对象。前面已经见到过这个方法,用法如下:var elementNode = document.getElementById(id-of-element);为 HTML 添加 id 属性这是非常简单的 JavaScript,但是需要修改一下 HTML:为需要访问的元素增加 id 属性。也就是希望(用带兔子的新图片)替换的 img 元素,因此将 HTML 改为清单 2 的形式。清单 2. 增加 id 属性 Magic Hat Welcome to the DOM Magic Shop! 如果重新加载(或者打开)该页面,可以看到
7、毫无变化,增加 id 属性对网页的外观没有影响。不过,该属性可以帮助 JavaScript 和 DOM 更方便地处理元素。抓住 img 元素现在可以很容易地使用 getElementById() 了。已经有了需要元素的 ID,即 topHat,可以将其保存在一个新的 JavaScript 变量中。在 HTML 页面中增加清单 3 所示的代码。清单 3. 访问 img 元素 Magic Hat function showRabbit() var hatImage = document.getElementById(topHat); Welcome to the DOM Magic Shop! 现
8、在打开或重新加载该网页同样没有什么惊奇的地方。虽然现在能够访问图片,但是对它还什么也没有做。回页首修改图片,麻烦的办法完成所需修改有两种方法:一种简单,一种麻烦。和所有的好程序员一样,我也喜欢简单的办法;但是运用较麻烦的办法是一次很好的 DOM 练习,值得您花点时间。首先看看换图片比较麻烦的办法;后面再重新分析一下看看有没有更简单的办法。用带兔子的新照片替换原有图片的办法如下:1. 创建新的 img 元素。 2. 访问当前 img 元素的父元素,也就是它的容器。 3. 在已有 img 元素之前 插入新的 img 元素作为该容器的子级。 4. 删除原来的 img 元素。 5. 结合起来以便在用户
9、单击 Hocus Pocus! 按钮时调用刚刚创建的 JavaScript 函数。 创建新的 img 元素通过上两期文章应该记住 DOM 中最关键的是 document 对象。它代表整个网页,提供了 getElementById() 这样功能强大的方法,还能够创建新的节点。现在要用到的就是这最后一种性质。具体而言,需要创建一个新的 img 元素。要记住,在 DOM 中一切都是节点,但是节点被进一步划分为三种基本类型: 元素 属性 文本节点 还有其他类型,但是这三种可以满足 99% 的编程需要。这里需要一个 img 类型的新元素。因此需要下列 JavaScript 代码:var newImage
10、 = document.createElement(img);这行代码可以创建一个 element 类型的新节点,元素名为 img。在 HTML 中基本上就是:要记住,DOM 会创建结构良好的 HTML,就是说这个目前为空的元素包括起始和结束标签。剩下的就是向该元素增加内容或属性,然后将其插入到网页中。对内容来说,img 是一个空元素。但是需要增加一个属性 src,它指定了要加载的图片。您也许认为要使用 addAttribute() 之类的方法,但情况并非如此。DOM 规范的制定者认为程序员可能喜欢简洁(的确如此!),因此他们规定了一个方法同时用于增加新属性和改变已有的属性值:setAttri
11、bute()。如果对已有的属性调用 setAttribute(),则把原来的值替换为指定的值。但是,如果调用 setAttribute() 并指定一个不 存在的属性,DOM 就会使用提供的值增加一个属性。一个方法,两种用途!因此需要增加下列 JavaScript 代码:var newImage = document.createElement(img);newImage.setAttribute(src, rabbit-hat.gif);它创建一个图片元素然后设置适当的资源属性。现在,HTML 应该如清单 4 所示。清单 4. 使用 DOM 创建新图片 Magic Hat function s
12、howRabbit() var hatImage = document.getElementById(topHat); var newImage = document.createElement(img); newImage.setAttribute(src, rabbit-hat.gif); Welcome to the DOM Magic Shop! 可以加载该页面,但是不要期望有任何改变,因为目前所做的修改实际上还没有影响页面。另外,如果再看看任务列表中的第 5 步,就会发现还没有调用我们的 JavaScript 函数!获得原始图片的父元素现在有了要插入的图片,还需要找到插入的地方。但是
13、不能将其插入到已有的图片中,而是要将其插入到已有图片之前然后再删除原来的图片。为此需要知道已有图片的父元素,实际上这就是插入和删除操作的真正关键所在。应该记得,前面的文章中曾经指出 DOM 确实把网页看成一棵树,即节点的层次结构。每个节点都有父节点(树中更高层次的节点,该节点是它的一个子级),可能还有自己的子节点。对于图片来说,它没有子级 要记住图片是空元素,但是它肯定有父节点。甚至不需要知道父节点是什么,但是需要访问它。为此,只要使用每个 DOM 节点都有的 parentNode 属性即可,比如:var imgParent = hatImage.parentNode;确实非常简单!可以肯定这
14、个节点有子节点,因为已经有了一个:原来的图片。此外,完全不需要知道它是一个 div、p 或者页面的 body,都没有关系!插入新图片现在得到了原来图片的父节点,可以插入新的图片了。很简单,有多种方法可以添加子节点: insertBefore(newNode, oldNode) appendChild(newNode) 因为希望把新图片放在旧图片的位置上,需要使用 insertBefore()(后面还要使用 removeChild() 方法)。可使用下面这行 JavaScript 代码把新图片元素插入到原有图片之前:var imgParent = hatImage.parentNode;imgP
15、arent.insertBefore(newImage, hatImage);现在原图片的父元素有了两个 子元素:新图片和紧跟在后面的旧图片。必须指出,这里包围 这些图片的内容没有变,而且这些内容的顺序也和插入之前完全相同。仅仅是这个父节点中增加了一个子节点,即旧图片之前的新图片。删除旧图片现在只需要删除旧图片,因为网页中只需要新图片。很简单,因为已经得到了旧图片元素的父节点。只要调用 removeChild() 并把需要删除的节点传递给它即可:var imgParent = hatImage.parentNode;imgParent.insertBefore(newImage, hatIma
16、ge);imgParent.removeChild(hatImage);现在,用新图片替换旧图片的工作已基本完成了。HTML 应该如清单 5 所示。清单 5. 用新图片替换旧图片 Magic Hat function showRabbit() var hatImage = document.getElementById(topHat); var newImage = document.createElement(img); newImage.setAttribute(src, rabbit-hat.gif); var imgParent = hatImage.parentNode; imgPa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六章建立基于 DOM Web 应用程序 第六 建立 基于
限制150内