事件绑定(终极版)

内容提纲:

1.问题所在

2.设置代码

发文不易,转载注明出处!

1.问题所在

现代绑定中W3C使用的是:addEventListener和removeEventListener。IE使用的是attachEvent和detachEvent。我们知道IE的这两个问题多多,并且伴随内存泄漏。所以,解决这些问题非常有必要。

那么我们希望解决非IE浏览器事件绑定哪些问题呢?

1.支持同一元素的同一事件句柄可以绑定多个监听函数;

2.如果在同一元素的同一事件句柄上多次注册同一函数,那么第一次注册后的所有注册都被忽略;

3.函数体内的this指向的应当是正在处理事件的节点(如当前正在运行事件句柄的节点);

4.监听函数的执行顺序应当是按照绑定的顺序执行;

5.在函数体内不用使用 event = event || window.event; 来标准化Event对象;

我们尝试着通过使用传统事件绑定对IE进行封装。

2.设置代码

  1 //跨浏览器添加事件绑定
  2
  3 function addEvent(obj, type, fn) {
  4
  5        if (typeof obj.addEventListener != ‘undefined‘) {
  6
  7               obj.addEventListener(type, fn, false);
  8
  9        } else {
 10
 11               //创建事件类型的散列表(哈希表)
 12
 13               if (!obj.events) obj.events = {};
 14
 15               //创建存放事件处理函数的数组
 16
 17               if (!obj.events[type]) {
 18
 19                      obj.events[type] = []; 28
 29                      //执行事件处理
 30
 31                      obj[‘on‘ + type] = addEvent.exec;
 32
 33               } else {
 34
 35                      //同一个注册函数取消计数
 36
 37                      if (addEvent.array(fn,obj.events[type])) return false;
 38
 39               }
 40
 41               //通过计数器存储
 42
 43               obj.events[type][addEvent.ID++] = fn;
 44
 45        }
 46
 47 }
 48
 49
 50
 51 addEvent.array = function (fn, es){
 52
 53        for (var i in es) {
 54
 55               if (es[i] == fn) return true;
 56
 57        }
 58
 59        return false;
 60
 61 }
 62
 63
 64
 65 //每个事件处理函数的ID计数器
 66
 67 addEvent.ID = 0;
 68
 69
 70
 71 //事件处理函数调用
 72
 73 addEvent.exec = function (event) {
 74
 75        var e = event || addEvent.fixEvent(window.event);
 76
 77        var es = this.events[e.type];
 78
 79        for (var i in es) {
 80
 81               es[i].call(this, e);
 82
 83        }
 84
 85 };
 86
 87
 88
 89 //获取IE的event,兼容W3C的调用
 90
 91 addEvent.fixEvent = function (event) {
 92   //为event添加preventDefault方法
 93        event.preventDefault = addEvent.fixEvent.preventDefault;
 95        event.stopPropagation = addEvent.fixEvent.stopPropagation;
 96
 97        return event;
 98
 99 };
100
101
102
103 //兼容IE和W3C阻止默认行为
104
105 addEvent.fixEvent.preventDefault = function () {
106
107        this.returnValue = false;
108
109 };
110
111
112
113 //兼容IE和W3C取消冒泡
114
115 addEvent.fixEvent.stopPropagation = function () {
116
117        this.cancelBubble = true;
118
119 };
120
121
122
123 //跨浏览器删除事件
124
125 function removeEvent(obj, type, fn) {
126
127        if (typeof obj.removeEventListener != ‘undefined‘) {
128
129               obj.removeEventListener(type, fn, false);
130
131        } else {
132
133               var es = obj.events[type];
134
135               for (var i in es) {
136
137                      if (es[i] == fn) {
138
139                             delete obj.events[type][i];
140
141                      }
142
143               }
144
145        }
146
147 }
时间: 2024-10-21 10:09:13

事件绑定(终极版)的相关文章

Jquery之事件绑定(bind(),live(),delegate(),on())

1..bind() 描述: 为一个元素绑定一个事件处理程序. .bind()一个基本的用法: $(selector).bind('click', function() { alert('User clicked on "foo."'); }); 可以直接用原生js替代为: $(selector).click( function() { alert('User clicked on "foo."'); }); 在jQuery1.4.3,您现在可以通过传递false代替

完美的jquery事件绑定方法on()

在讲on()方法之前,我们先讲讲在on()方法出现前的那些事件绑定方法: .live() jQuery 1.3新增的live()方法,用法如下: $("#info_table td").live("click",function(){/*显示更多信息*/}); 这里的.live()方法会把click事件绑定到$(document)对象,而且只需要给$(document)绑定一次,然后就能够处理后续动态加载的单元格的单击事件.在接收到任何事件时,$(document)

on事件绑定阻止冒泡的问题

当使用on进行事件绑定时当要给document绑定click,而子元素要禁止冒泡,那么子元素里面的子元素的click事件就会无效了, 下面无效版: $('#queue').on('click', '.link', function() { var t = $(this) ,box = t.next() if(t.hasClass('active')) { box.hide() t.removeClass('active') } else { box.show() t.addClass('acti

前端进阶之路:点击事件绑定

网址:http://web.jobbole.com/83591/ 背景 我是一个前端小兵,我在一家互联网公司做做一些简单的业务开发. 某一天,我接到了一个需求,做一个抽奖功能.公司里的前辈们已经完成了业务逻辑,而且已经提供了业务功能的接口,只需要我制作页面并完成事件绑定即可. 我写好了页面,页面中有一个 ID 为 lucky-draw 的按钮元素.接下来,我需要为它绑定点击事件.我是这样写的: var btn = document.getElementById('lucky-draw') btn

(转)JavaScript事件---事件绑定和深入

内容提纲: 1.传统事件绑定的问题 2.W3C事件处理函数 3.IE事件处理函数 4.事件对象的其他内容 事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型),一种是现代事件绑定(DOM2级模型).现代事件绑定在传统绑定上提供了更强大更方便的功能.   一.传统事件绑定的问题 传统事件绑定有内联模型和脚本模型,内联模型我们不做讨论,基本很少去用.先来看一下脚本模型,脚本模型将一个函数赋值给一个事件处理函数. 1 var box = document.getElementById('box'

js事件绑定及深入

学习要点: 1.传统事件绑定的问题2.W3C事件处理函数3.IE事件处理函数4.事件对象的其他补充 事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型),一种是现代事件绑定(DOM2级模型).现代事件绑定在传统绑定上提供了更强大更方便的功能. 一 传统事件绑定的问题 传统事件绑定中的内联模型不做讨论,基本很少去用.先来看一下脚本模型,脚本模型将一个函数赋值给一个事件处理函数.传统绑定如: window.onload=function(){ var box=document.getEleme

jQuery的三种bind/One/Live/On事件绑定使用方法

本篇文章介绍了,关于jQuery新的事件绑定机制on()的使用技巧.需要的朋友参考下 今天浏览jQuery的deprecated列表,发现live()和die()在里面了,赶紧看了一下,发现从jQuery1.7开始,jQuery引入了全新的事件绑定机制,on()和off()两个函数统一处理事件绑定.因为在此之前有bind(), live(), delegate()等方法来处理事件绑定,jQuery从性能优化以及方式统一方面考虑决定推出新的函数来统一事件绑定方法并且替换掉以前的方法. on(eve

jquery 新建的元素事件绑定问题[转]

原文:http://www.cnblogs.com/linzheng/archive/2010/10/17/1853568.html js的事件监听跟css不一样,css只要设定好了样式,不论是原来就有的还是新添加的,都有一样的表现.而事件监听不是,你必须给每一个元素单独绑定事件. 常见的例子是处理表格的时候.每行行末有个删除按钮,点了这个能够删除这一行. <table>    <tbody>        <tr>            <td>这行原来就

jquery 新建的元素事件绑定问题

js的事件监听跟css不一样,css只要设定好了样式,不论是原来就有的还是新添加的,都有一样的表现.而事件监听不是,你必须给每一个元素单独绑定事件. 常见的例子是处理表格的时候.每行行末有个删除按钮,点了这个能够删除这一行. <table>    <tbody>        <tr>            <td>这行原来就有</td>            <td><buttonclass="del"&g