javascript事件代理(委托)
之前有接触过事件代理,但是印象并不深刻。这次记下来加强印象。
用个大家比较常见的代码举例子:
html dom结构:
<ul id="ul1">
<li>001</li>
<li>002</li>
<li>003</li>
</ul>
需求:如果需要给每个li添加点击事件。js代码如下
<script>
var oUl = document.getElementById('ul1');
var aLi = oUl.getElementsByTagName('li');
for (var i = 0, i = aLi.length; i++) {
aLi[i].onclick = fn;
}
</script>
常规实现方法:遍历每个li,给每个li单独加点击事件。
缺点:
1、假如现在页面有很多个li,比如门户新闻网站新闻列表。如果需要遍历的话,比较影响性能。
2、如果新添加一个li,比如发微博的时候,刚刚发出来的微博,会不会刚发出来的微博就带事件了。
针对第2点:答案是新创建的元素是不带有之前遍历的事件,因为在创建元素之前,已经遍历完li,给已经存在的li加事件了。
解决方案:
为了解决上面这两个缺点,我们用事件代理,也叫事件委托的方式实现。
为了更好理解事件委托,应该先了解一下事件冒泡知识。在这里,我就不详细说事件冒泡了。
根据事件冒泡或者捕获的特性,我们可以给ul加点击事件。
代码:
var oUl = document.getElementById('ul1');
oUl.onclick = function(ev) {
var ev = ev || event;
//兼容处理
var target = ev.target || ev.srcElement;
//找到li元素
if (target.nodeName.toLowerCase() == 'li') {
//li添加的事件
fn();
}
}
总结:虽然ev对象有一定的兼容性,但是在此处兼容性处理并不难。其实事件委托本质就是给多组元素的父级加事件,再利用冒泡或者捕获找到下面的子元素,然后单独绑定事件。
javascript事件代理(委托)的更多相关文章
- JavaScript事件代理和委托(Delegation)
JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委 ...
- JavaScript事件代理和委托
在javasript中,代理.委托经常出现. 那么它究竟在什么样的情况下使用?它的原理又是什么? 这里介绍一下javascript delegate的用法和原理,以及Dojo,jQuery等框架中de ...
- JavaScript 事件代理
转自:http://www.cnblogs.com/silence516/archive/2009/09/03/delegateEvent.html 如果你想给网页添加点JavaScript的交互性, ...
- JavaScript事件代理和事件委托
一.概述: 那什么叫事件委托呢?它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件.那这是什么意思呢?网上的 ...
- JavaScript中的事件代理/委托
事件委托在JS高级程序设计中的定义为"利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件" 如何理解上面的这句话呢,在网上,大牛们一般都使用收快递这个例子来解释的, ...
- JavaScript事件代理入门
事件代理(Event Delegation),又称之为事件委托.是 JavaScript 中常用绑定事件的常用技巧. 顾名思义,“事件代理”即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的 ...
- javascript 事件代理及应用
事件代理又叫事件委托在前端发开中实际是非常有用的,说事件代理之前我们先说说事件绑定 <p onclick="test()" ></p> function t ...
- 【转载】浅谈事件冒泡与事件捕获 - javascript 事件代理
原文:https://segmentfault.com/a/1190000000749838 事件冒泡与事件捕获 事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发 ...
- javascript事件代理(Event Delegation)
看了几篇文章,放上来供参考 司徒正美的文章,Event Delegation Made Easy --------------------------------------------------- ...
随机推荐
- github 多帐户使用
同一台电脑有2个github账号?咋办 比如一个公司账号一个个人账号. 私人账号如下: 邮箱example@126.com 账号:example 公司工作账号如下: work@xx.com 账号:my ...
- sc7731 Android 5.1 Camera 学习之一Camera 两个对象
众所周知,在Android中Camera采用了C/S架构,其中Camera server 与 Camera client之间通过Android Binder IPC机制进行通信.在Camera实现的框 ...
- SCVMM之Windows Server2012 R2新功能
在Windows Server 2012 R2中可以通过使用共享的虚拟硬盘VHDX文件的方法来模拟IP SAN,来为虚拟机创建群集提供共享存储.这样为虚拟机创建群集时就不用再像以前一样通过使用软件模拟 ...
- nginx 配置http2
1.需要nginx 1.9.5+版本 2.需要ssl 证书 个人免费ssl 证书:https://buy.wosign.com/free/ 3.配置如下: server { listen ssl ht ...
- android设置动态壁纸 (Wallpaper) 介绍
当进入改壁纸的设置页面 但是还没有设置时 09-21 07:55:05.575: INFO/System.out(1337): service onCreate09-21 07:55:05.614: ...
- TP复习9
配置文件 'TMPL_TEMPLATE_SUFFIX'=>'.html',//更改模板文件后缀名'TMPL_FILE_DEPR'=>'_',//修改模板文件目录层次'TMPL_DETECT ...
- [MongoDB] Query, update, index and group
/* 1. Query Operators */ db.posts.find({ viewsCount: {$get: 1000, $lte: 3000} }, {_id: 0, viewsCount ...
- Why the framework uses ruby instead of perl?[转]
During the development of the framework, the one recurring question that the Metasploit staff was co ...
- 跟大家分享下今天所学到的PHP,虽然很基础,但是感觉也很重要
PHP:Hypertext PreProcessor(超文本预处理语言) PHP是一种服务器端语言(server-side language),服务器只发送脚本的输出,通常是HTML,PHP也可以用于 ...
- 在Dropbox上搭建私有的Git仓库的教程
导读 Git版本控制系统需要一个服务器端,而GitHub上要想创建私有的Git服务器端仓库则触及到收费项目,于是这里我们利用Dropbox的免费空间,来看一下在Dropbox上搭建私有的Git仓库的教 ...