浅谈事件代理

1、什么是事件代理

意思:代理、委托。事件代理在JS世界中一个非常有用也很有趣的功能。当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委托给父节点来触发处理函数。

2、运用场景

当子元素被频繁添加或者删除时,给子元素绑定事件,需要在每次添加或者删除时重新绑定,这就造成了非常不方便,那么此时此刻:事件代理,能帮你轻松解决这个麻烦的问题。

3、下面是我实现的一个简单的事件代理方法

 1 /**
 2      * 事件处理对象
 3      * @type {{addHandler: addHandler, removeHandler: removeHandler}}
 4      */
 5     var EventUtil = {
 6         addHandler: function (element, type, handler) {
 7             if (element.addEventListener) {
 8                 element.addEventListener(type, handler, false);
 9             } else if (element.attachEvent) {
10                 element.attachEvent("on" + type, handler);
11             } else {
12                 element["on" + type] = handler;
13             }
14         },
15         removeHandler: function(element, type, handler){
16             if (element.removeEventListener){
17                 element.removeEventListener(type, handler, false);
18             } else if (element.detachEvent){
19                 element.detachEvent("on" + type, handler);
20             } else {
21                 element["on" + type] = null;
22             }
23         }
24     };
25     /**
26      * 比较当前选择于目标函数是否相等
27      * @param element 当前元素
28      * @param selector 目标元素标识
29      */
30     function matchesSelector(element, selector){
31         if(element.matches){
32             return element.matches(selector);
33         } else if(element.matchesSelector){
34             return element.matchesSelector(selector);
35         } else if(element.webkitMatchesSelector){
36             return element.webkitMatchesSelector(selector);
37         } else if(element.msMatchesSelector){
38             return element.msMatchesSelector(selector);
39         } else if(element.mozMatchesSelector){
40             return element.mozMatchesSelector(selector);
41         } else if(element.oMatchesSelector){
42             return element.oMatchesSelector(selector);
43         } else if(element.querySelectorAll){
44             var matches = (element.document || element.ownerDocument).querySelectorAll(selector),
45                 i = 0;
46             while(matches[i] && matches[i] !== element) i++;
47             return matches[i] ? true: false;
48         }
49         throw new Error(‘Your browser version is too old,please upgrade your browser‘);
50     }
51
52     /**
53      *
54      * @param parent 父节点id或者父节点元素
55      * @param eventStr 触发事件
56      * @param childTag 触发事件元素标志
57      * @param handler 事件句柄
58      * @constructor
59      */
60     function Delegate (parent, eventStr, childTag, handler) {
61         var event = eventStr.toLowerCase(),
62             parentObj = null;
63         if (typeof parent == ‘object‘) {
64             parentObj =
65                     parent === document || parent === document.body || parent === document.documentElement ?
66                     document.body :
67                     parent;
68         } else {
69             parentObj = document.getElementById(parent);
70         }
71         EventUtil.addHandler(parentObj, event, function (e) {
72             var parentElement = e.target;
73             while (parentElement != e.currentTarget) {//从子节点向上冒泡遍历每一个节点与目标节点比较,一直到父节点停止
74                 if (matchesSelector(parentElement, childTag)) {
75                     handler.call(parentElement, e);
76                 }
77                 parentElement = parentElement.parentElement;
78             }
79         });
80     }
81
82     Delegate(document, ‘click‘, ‘.a‘, function () {
83         alert(this.innerHTML);
84     }, false);
85     Delegate(‘J_list2Wrapper‘, ‘click‘, ‘li‘, function () {
86         alert(this.innerHTML);
87     }, false);
88     Delegate(‘J_list3Wrapper‘, ‘click‘, ‘span‘, function () {
89         alert(this.innerHTML);
90     }, false);

运行demo:http://runjs.cn/detail/iaz5oole

关于事件代理还有很多东西可以深入学习和研究,希望大家给我支持,多留言,一起讨论,共同进步,谢谢!!!

时间: 2024-10-21 04:59:55

浅谈事件代理的相关文章

浅谈事件监听

自从学了事件监听之后,觉得他真是个好东西~~,为什么呢? 首先说下他的好处:第一点:他可以实现对未来元素事件的绑定[?未来元素:就是在绑定事件时,页面上还不存在的元素]:第二点:减少事件绑定,提高性能[我们知道前端主要是解决性能优化和兼容问题的,所有这个就挺重要了] 下面来捋一捋事件监听一个比较全面的见解? 1.关于事件 事件分为DOM 0级事件和Dom 2级事件,DOM2级事件也叫做事件监听.DOM 0级事件的缺点是如果事件相同 后者的事件会覆盖前者的事件,DOM2级事件可以解决这个问题 do

浅谈静态代理和动态代理

所谓代理,就是我写一个代理类,去代理被代理对象的执行业务 静态代理就是为每一个需要被代理的类写一个代理类,动态代理就是运行时动态生成代理类,主要有JDK提供的和CGlib提供的 JDK:动态代理类要实现InvocationHandler接口,实现invoke(在代理行为前后增加一些方法)方法,生成时,用类Proxy的newProxyInstance(被代理类的类加载器,被代理类实现的所有接口,被代理对象)方法生成代理类.好处是当接口变了,代理类不用动 唯一的缺点就是不能代理一个没有接口的类 CG

浅谈事件冒泡和事件捕获

首先我们来说说什么是事件冒泡 事件冒泡:子级寻找父级的过程 当子级触发事件时,这个事件会形成一个时间流,这个事件流会逐步的向上传播, 所经过的父级的和子级相同的事件会被执行 事件捕获:父级查找子级的过程叫事件捕获 当子级触发一个事件时会触发事件流,这个事件流会从父级传递到子级,所经过的 所有子级的相同事件会被触发 事件冒泡是由IE提出,而事件捕获是由网景提出 由上面这句话可以看出来一个问题 IE的捕获机制和其他的浏览器捕获有什么不同:  IE只有事件冒泡,而标准浏览器既有事件捕获和事件冒泡 现在

Atitit.  Js 冒泡事件阻止 事件捕获   事件传递  事件代理

Atitit.  Js 冒泡事件阻止 事件捕获   事件传递  事件代理   1. 事件冒泡1 2. 事件捕获1 3. 同时支持了事件捕获阶段和事件冒泡阶段ddEventListener的第三个参数1 4. 事件代理3 5. 冒泡还是捕获?3 6. Js 冒泡事件阻止3 6.1. 返回false5 7. 事件冒泡 使处理函数有范围较大的触发面积,在“拖拽效果”脚本中是必须的5 8. refe6 8.1.1. 浅谈事件冒泡与事件捕获 - ac黄博客精选 - SegmentFault6   1. 事

浅谈getaddrinfo函数的超时处理机制

在sockproxy上发现,getaddrinfo 解析域名相比ping对域名的解析,慢很多.我觉得ping用了gethostbyname解析域名.问题变为getaddrinfo解析域名,是否比 gethostbyname慢.写测试程序,分别用getaddrinfo和gethostbyname解析,发现getaddrinfo确实慢. strace跟踪发现,getaddrinfo和DNS服务器通信10次,gethostbyname和DNS服务器通信2次. gethostbyname是古老的域名解析

浅谈委托和事件(一)

浅谈委托和事件(一) 关于委托和事件,可能是.NET或者说是面向对象编程语言中的一个比较重要又比较难以理解的概念.关于这一话题,园子里的人也写了很多文章,最经典的可能就是张子阳的C#中的委托和事件这两篇文章了,之前也看过MSDN 上的WebCast深入 "委托和事件".可能和很多人一样,刚开始读的时候,觉得很清楚,但是过了一段时间好像又忘记了委托和事件的区别,知道很久以前,在一次面试中我被问到委托和事件有什么区别,一下子就说不清了. 所以这里稍微理一下,也算是自己的一个总结.当然,还是

( 转)浅谈QT中窗口刷新事件

浅谈QT中窗口刷新事件 [日期:2011-06-25] 来源:Linux社区  作者:袁硕 [字体:大 中 小] 经过一个星期的项目初步开发,写此文就开发时遇到的一些常见问题,给出些资料和自己的观点,希望能给其他的初学者或者参赛的选手一点帮助,当然,也算是一种抛砖引玉,大家有什么好的技巧经验什么的,也能多多分享,借助这次比赛,我们共同进步~ 如果大家都是跟我一样,刚刚开始接触QT,开始开发QT的程序,肯定也会有很多不习惯的地方,今天我重点想谈的就是这么一个不习惯的地方——QT中窗口刷新事件. 对

浅谈Android onClick与onLongClick事件触发的问题

之前做按钮的点击事件一直没有注意一些细节,今天做了一个按钮需要有点击和长点击触发不同效果,直接让Activity implements OnClickListener, OnLongClickListener然后添加了相应的处理函数. @Override public void onClick(View v) { // TODO Auto-generated method stub } @Override public boolean onLongClick(View v) { // TODO

C#控件中的KeyDown、KeyPress 与 KeyUp事件浅谈

C#控件中的KeyDown.KeyPress 与 KeyUp事件浅谈 研究了一下KeyDown,KeyPress 和 KeyUp 的学问.让我们带着如下问题来说明: 1.这三个事件的顺序是怎么样的? 2.KeyDown 触发后,KeyUp是不是一定触发? 3.三个事件的定义 4.KeyDown.KeyUp 和KeyPress 之间的区别 5.如何区分是否按的是小键盘? 6.PrScrn按键三个事件能够捕获吗? 7.{菜单键}和{开始键}KeyPress能够捕获吗? 8.如何捕获系统的组合键? 9