跳转到路径导航栏
跳转到正文内容

用JavaScript的事件代理实现互动

http://www.sina.com.cn  2009年01月19日 08:49  《程序员》

  如果你想要给你的网页添加点JavaScript的交互性的话,你也许已经听过JavaScript的事件代理(event delegation)了,并且觉得这是那些发烧友级别的JavaScript程序员才会关心的什么费解的设计模式之一。事实上,如果你已经知道怎么添加 JavaScript的事件处理器(event handler),实现事件代理也是件轻而易举的事情。

  JavaScript事件是所有网页互动性的根基(我指的是真正的互动性,而不仅是那些CSS的下拉菜单)。在传统的事件处理中,你按照需要为每一个元素添加或者是删除事件处理器。然而,事件处理器将有可能导致内存泄露或者是性能下降——你用得越多这种风险就越大。JavaScript事件代理则是一种简单的技巧,通过它你可以把事件处理器添加到一个父级元素上,这样就避免了把事件处理器添加到多个子级元素上。

  它是怎么运作的呢?

  事件代理用到了两个在JavaSciprt事件中常被忽略的特性:事件冒泡以及目标元素。当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发。这一过程被称为事件冒泡;这个事件从原始元素开始一直冒泡到DOM树的最上层。任何一个事件的目标元素都是最开始的那个元素,在我们的这个例子中也就是按钮,并且它在我们的元素对象中以属性的形式出现。使用事件代理的话我们可以把事件处理器添加到一个元素上,等待一个事件从它的子级元素里冒泡上来,并且可以很方便地得知这个事件是从哪个元素开始的。

  这对我有什么好处呢?

  想象一下现在我们有一个10列、100行的HTML表格,你希望在用户点击表格中的某一单元格的时候做点什么。比如说我有一次就需要让表格中的每一个单元格在被点击的时候变成可编辑状态。如果把事件处理器加到这1000个单元格会产生一个很大的性能问题,并且有可能导致内存泄露甚至是浏览器的崩溃。相反地,使用事件代理的话,你只需要把一个事件处理器添加到table元素上就可以了,这个函数可以把点击事件给截下来,并且判断出是哪个单元格被点击了。

  用代码写出来的话是什么样呢?

  代码很简单,我们所要关心的只是如何检测目标元素而已。比方说我们有一个table元素,ID是 “report”,我们为这个表格添加一个事件处理器以调用editCell函数。editCell函数需要判断出传到table来的事件的目标元素。考虑到我们要写的几个函数中都有可能用到这一功能,所以我们把它单独放到一个名为getEventTarget的函数中:

  function getEventTarget(e) {

  e = e || window.event;

  return e.target || e.srcElement;

  }e这个变量表示的是一个事件对象,我们只需要写一点点跨浏览器的代码来返回目标元素,在IE里目标元素放在srcElemtn属性中,而在其它浏览器里则是target属性。

上一页 1 2 下一页

本文相关下载

更多>> 
JavaScript Editor Pro 4.0
可以使你轻松快速的在网页中插入JavaScript代码。
SurfMap JavaScript 2.1
帮助你建立JavaScript的站点导航条。
JavaScript Plus! 6.0
一个运行于Windows下的专业JavaScript编辑器,界面友好简单易用,启动迅速。

>话题讨论查看全部评论

已有 _COUNT_位网友发表评论  
登录名: 密码: 匿名发表

Powered By Google
flash

新浪简介About Sina广告服务联系我们招聘信息网站律师SINA English会员注册产品答疑┊Copyright © 1996-2009 SINA Corporation, All Rights Reserved

新浪公司 版权所有