javascript 事件代理及应用
事件代理又叫事件委托在前端发开中实际是非常有用的,说事件代理之前我们先说说事件绑定
<p onclick="test()" ></p>
function test(){
do something.....
alert(this);
}
js 代码和 html 代码耦合在了一起,不便于维护和开发,尽量不要使用这种方法绑定事件,还有一个不好的地方这样绑定事件this指向的是window而不是元素本身。
或者可以这样绑定
<p class="text" >22</p>
var Text = document.querySelector('.text');
Text.onclick = function(){
alert(this.innerText) //22
}
还有一种事件绑定(监听)的方法由于ie 和w3c提供的api不同存在兼容性问题一般要自己封装一下做兼容性的处理。
<p id="test">22</p>
var addEvent = function(elem,type,handler){
if(window.addEventListener){
addEvent = function(elem,type,handler){
elem.addEventListener(type,handler,false);
}
}else if(window.attachEvent){
addEvent = function(elem,type,handler){
elem.attachEvent('on'+type,handler);
}
}
addEvent(elem,type,handler);
}
var inp = document.querySelector("#test");
addEvent(inp,'click',test);
function test(){
alert(this.innerText); // 弹出22
}
好到现在为止常见的事件绑定方式说的都差不多了,事件代理的前提是要有事件绑定通过对父级或者父父级元素进行绑定看下面的例子。
<ul class="list">
<li>1233</li>
<li>222</li>
<li>333</li>
<li>444</li>
</ul>
<script>
var oUl = document.querySelector(".list");
oUl.onclick=function(e){
e = e || window.event;
var elem = e.target || e.srcElemnt;
if(elem.tagName.toLowerCase() === 'li'){
alert(elem.innerText);
}
}
</script>
上面的几个例子都是alert出元素的innerText但是采用事件代理方式性能会跟好,因为他不需要给每一个li绑定一个事件只需要给父级绑定一个事件即可。我们看看jq实现事件代理的方式
<ul class="list">
<li>1233</li>
<li>222</li>
<li>333</li>
<li>444</li>
</ul>
<script>
$('.list').on('click','li',delegate)
function delegate(){
alert($(this).text());
}
//或者这样但是推荐使用上面种方式 $('.list').delegate('li','click',delegate);
</script>
使用事件代理的时候有一点需要注意的就是事件冒泡如果你的目标元素(上面的例子li就是目标元素)和目标元素父级或者父父级的tagNanme(标签名)相同的话事件就会冒泡的相同标签名的父级上这是就需要阻止事件冒泡。来看一个例子
<style>
.box1{
position:relative;
width:300px;
height: 300px;
background:red;
}
.box2{
position:absolute;
top:50px;
left:50px;
width:200px;
height:200px;
background:yellow;
}
.box3{
top:50px;
left:50px;
position:absolute;
width:100px;
height:100px;
background:blue;
}
</style>
<div class="box1" >
box1
<div class="box2">
box2
<div class="box3">
box3
</div>
</div>
</div>
<script>
$('.box1').on('click','div',delegate)
function delegate(){
alert($(this).text());
}
//$('.list').delegate('li','click',delegate);
</script>

在上面的例子中给box1绑定了一个事件弹出box1下面div的innerText当我们点击box3的时候对话框弹出了两次一次是box3的innerText一次是box2的innerText说明事件冒泡到了box3的父级box2哪里也被触发了一次aler innerText 这个时候我们就要用的阻止事件冒泡了。
<style>
.box1{
position:relative;
width:300px;
height: 300px;
background:red;
}
.box2{
position:absolute;
top:50px;
left:50px;
width:200px;
height:200px;
background:yellow;
}
.box3{
top:50px;
left:50px;
position:absolute;
width:100px;
height:100px;
background:blue;
}
</style>
<div class="box1" >
box1
<div class="box2">
box2
<div class="box3">
box3
</div>
</div>
</div>
<script>
$('.box1').on('click','div',delegate)
function delegate(e){
e.stopPropagation();
alert($(this).text());
}
//$('.list').delegate('li','click',delegate);
</script>
在原有的基础上多加了一句 e.stopPropagation(); 这样就可以得到我们想要的效果了。
事件代理一般用在什么样的场景呢?
1 当有多个相同标签名的元素需要绑定事件的时候如ul 下面的li需要给每个li绑定事件 我们就可以给ul去绑定事件去做处理。
2 从后端获取数据生成的节点元素需要绑定事件的时候。
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 事件代理
原文:https://segmentfault.com/a/1190000000749838 事件冒泡与事件捕获 事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发 ...
- JavaScript事件代理入门
事件代理(Event Delegation),又称之为事件委托.是 JavaScript 中常用绑定事件的常用技巧. 顾名思义,“事件代理”即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的 ...
- JavaScript事件代理和事件委托
一.概述: 那什么叫事件委托呢?它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件.那这是什么意思呢?网上的 ...
- javascript事件代理(委托)
之前有接触过事件代理,但是印象并不深刻.这次记下来加强印象. 用个大家比较常见的代码举例子: html dom结构: <ul id="ul1"> <li>0 ...
- javascript事件代理(Event Delegation)
看了几篇文章,放上来供参考 司徒正美的文章,Event Delegation Made Easy --------------------------------------------------- ...
- JavaScript 事件代理绑定
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- poj2778DNA Sequence (AC自动机+矩阵快速幂)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud DNA Sequence Time Limit: 1000MS Memory ...
- [转载]Silverlight实用窍门系列:71.Silverlight的Style
本文版权归作者和博客园共有,欢迎转载,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 原文链接:http://www.cnblogs.com/chengx ...
- InetAddress类的使用
1.1. 简介 IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础.InetAddress是Java对IP地址的封装,在java.net中有 ...
- Javascript经典实例 - 正则表达式
1] 正则常用字符 正则表达式常用的特殊字符 字符 匹配 示例 ^ 匹配输入的开始 /^This/匹配 “This is ...” $ 匹配输入的结束 /end$/匹配“This is the end ...
- [C++程序设计]基于对象的程序设计 基于对象的程序设计
1. 面向对象分析(object oriented analysis,OOA)2. 面向对象设计(object oriented design,OOD)3. 面向对象编程(object oriente ...
- Python中def的用法
def定义了一个模块的变量,或者说是类的变量.它本身是一个函数对象.属于对象的函数,就是对象的属性. def func(): return 2print func() # 1func = 5pr ...
- 自己动手写PHP MVC框架
自己动手写PHP MVC框架 来自:yuansir-web.com / yuansir@live.cn 代码下载: https://github.com/yuansir/tiny-php-framew ...
- USB Mass Storage学习笔记-STM32+FLASH实现U盘
一.内容概述 采用STM32内部自带USB控制器外加大页NAND FLASH K9F1G08U0A实现一个128M的U盘. 1.STM32的USB控制器 STM32F103的MCU自带USB从控制器 ...
- zend studio使用入门
使用zend studio8建立项目 使用PHP开发工具zend studio8进行PHP网站开发,就需要建立(导入)相应的项目,方法如下:右键左侧Workspace,选择New | PHP Proj ...
- Kth Smallest Element in a BST 解答
Question Given a binary search tree, write a function kthSmallest to find the kth smallest element i ...