`

值得推荐的事件捕获函数AddEvent()

 
阅读更多

1, 下面是JQuery之父推荐的添加移除事件方法。

Java代码 复制代码
  1. /*
  2. *obj要绑定事件的对象
  3. *type事件类型,指"click","load","submit","mouseover"等
  4. *fn函数名
  5. */
  6. functionaddEvent(obj,type,fn)
  7. {
  8. if (obj.attachEvent)
  9. {
  10. obj[ 'e' +type+fn]=fn;
  11. obj[type+fn]=function()
  12. {
  13. obj[ 'e' +type+fn](window.event);
  14. }
  15. obj.attachEvent( 'on' +type,obj[type+fn]);
  16. }
  17. else
  18. obj.addEventListener(type,fn, false );
  19. }
  20. /*
  21. *obj要删除事件的对象
  22. *type事件类型,指"click","load","submit","mouseover"等
  23. *fn函数名
  24. */
  25. functionremoveEvent(obj,type,fn)
  26. {
  27. if (obj.detachEvent)
  28. {
  29. obj.detachEvent( 'on' +type,obj[type+fn]);
  30. obj[type+fn]= null ;
  31. }
  32. else
  33. obj.removeEventListener(type,fn, false );
  34. }
  35. //addEvent(document.getElementById('foo'),'click',doSomething);

2.《Pro JavaScript Techniques》来看,John Resig大大推荐了Dean Edwards的addEvent()方法,而没推荐自己更精简的作品,他这样评价Edwards的addEvent()的:

1 ,可以在所有浏览器中工作,就算是古老得无任何支持的浏览器;
  1. 2 this 关键字可在所有的绑定函数中使用,指向的是当前元素;
  2. 3 ,中和了所有防止浏览器默认行为和阻止事件冒泡的各种浏览器特定函数;
  3. 4 ,不管浏览器类型,事件对象总是作为第一个对象传入;
  4. 5 ,唯一缺点是仅工作在冒泡阶段(因为深入使用事件绑定的传统方法)。
  5. 6 ,addEvent/removeEvent函数如此强大,绝对没有任何理由不在你的代码中使用。
1, 可以在所有浏览器中工作,就算是古老得无任何支持的浏览器;
2, this关键字可在所有的绑定函数中使用,指向的是当前元素;
3, 中和了所有防止浏览器默认行为和阻止事件冒泡的各种浏览器特定函数;
4, 不管浏览器类型,事件对象总是作为第一个对象传入;
5, 唯一缺点是仅工作在冒泡阶段(因为深入使用事件绑定的传统方法)。
6, addEvent/removeEvent函数如此强大,绝对没有任何理由不在你的代码中使用。



而Dean Edwards这样说:
My solution is very different.

* it performs no object detection
* it does not use the addeventListener/attachEvent methods
* it keeps the correct scope (the this keyword)
* it passes the event object correctly
* it is entirely cross-browser (it will probably work on IE4 and NS4)
* and from what I can tell it does not leak memory

下面是Dean Edwards的addEvent/removeEvent函数:

Java代码
  1. //http://dean.edwards.name/weblog/2005/10/add-event/
  2. functionaddEvent(element,type,handler){
  3. if (element.addEventListener){
  4. element.addEventListener(type,handler, false );
  5. } else {
  6. //为每一个事件处理函数赋予一个独立的ID
  7. if (!handler.$$guid)handler.$$guid=addEvent.guid++;
  8. //为元素建立一个事件类型的Hash表
  9. if (!element.events)element.events={};
  10. //为每对元素/事件建立一个事件处理函数的Hash表
  11. varhandlers=element.events[type];
  12. if (!handlers){
  13. handlers=element.events[type]={};
  14. //存储已有的事件处理函数(如果已存在一个)
  15. if (element[ "on" +type]){
  16. handlers[ 0 ]=element[ "on" +type];
  17. }
  18. }
  19. //在Hash表中存储该事件处理函数
  20. handlers[handler.$$guid]=handler;
  21. //赋予一个全局事件处理函数来处理所有工作
  22. element[ "on" +type]=handleEvent;
  23. }
  24. };
  25. //创建独立ID的计数器
  26. addEvent.guid= 1 ;
  27. functionremoveEvent(element,type,handler){
  28. if (element.removeEventListener){
  29. element.removeEventListener(type,handler, false );
  30. } else {
  31. //从Hash表中删除事件处理函数
  32. if (element.events&&element.events[type]){
  33. deleteelement.events[type][handler.$$guid];
  34. }
  35. }
  36. };
  37. functionhandleEvent(event){
  38. varreturnValue= true ;
  39. //获取事件处理对象(IE使用全局的事件对象)
  40. event=event||fixEvent((( this .ownerDocument|| this .document|| this ).parentWindow||window).event);
  41. //获取事件处理函数Hash表的引用
  42. varhandlers= this .events[event.type];
  43. //依次处理每个事件处理函数
  44. for (variinhandlers){
  45. this .$$handleEvent=handlers[i];
  46. if ( this .$$handleEvent(event)=== false ){
  47. returnValue= false ;
  48. }
  49. }
  50. return returnValue;
  51. };
  52. //增加一些IE事件对象的缺乏的方法
  53. functionfixEvent(event){
  54. //增加W3C标准事件方法
  55. event.preventDefault=fixEvent.preventDefault;
  56. event.stopPropagation=fixEvent.stopPropagation;
  57. return event;
  58. };
  59. fixEvent.preventDefault=function(){
  60. this .returnValue= false ;
  61. };
  62. fixEvent.stopPropagation=function(){
  63. this .cancelBubble= true ;
  64. };
分享到:
评论

相关推荐

    js事件详解-0-1-2级模型.pdf

    此外,还介绍了一个`addEvent`函数,这是一个用于添加事件监听器的函数,它考虑了对同一个事件类型的多个监听器的管理。 4. 事件对象:在处理事件时,会有一个事件对象传递给事件处理函数,通过这个事件对象可以...

    驱动事件的addEvent.js代码

    - **添加事件**:当调用`addEvent`函数时,事件信息会被添加到`listEvents`中。 - **清除事件**:`flush`方法用于在页面卸载时移除所有已绑定的事件监听器。这里使用了`removeEventListener`和`detachEvent`来确保...

    JS事件冒泡浏览器兼容

    如果该参数为`true`,则事件处理函数会在捕获阶段执行;如果为`false`(默认),则在冒泡阶段执行。在IE8及以上版本,这两个方法也得到了支持,但在此之前,需要使用`attachEvent`和`detachEvent`,它们不支持事件...

    javascript 添加和移除函数的通用方法

    因此,为了兼容不同浏览器,我们需要编写一个通用的添加事件监听函数addEvent。在这个函数中,我们首先检查节点是否具有addEventListener方法,如果有,使用W3C标准方法来添加事件监听器,并通过指定第三个参数为...

    JavaScript实现为事件句柄绑定监听函数的方法分析

    W3C推荐的`addEventListener`方法允许添加多个事件监听器,且支持事件捕获和冒泡阶段。每个监听函数都可以独立处理事件,`this`指向触发事件的元素。但遗憾的是,Internet Explorer(IE)早期版本不支持此方法。 3...

    JavaScript为事件句柄绑定监听函数实例详解

    W3C标准的事件监听方法是`addEventListener`,它允许在同一事件句柄上注册多个监听函数,并可以选择在捕获或冒泡阶段执行。例如: ```javascript elem.addEventListener('click', function() {...}, false); ``` 这...

    【iScroll源码学习03】iScroll事件机制与滚动条的实现.pdf

    通常,我们使用`addEventListener`方法添加事件监听器,传入三个参数:事件类型、回调函数和是否在捕获阶段触发。然而,iScroll采取了一种非典型的方式,将事件处理器设置为一个对象,而不是直接使用函数。例如,当...

    理解JS绑定事件

    为了实现跨浏览器的事件绑定,我们可以编写一个兼容函数,如示例中的`addEvent`。这个函数会检查浏览器是否支持`addEventListener`,如果支持就使用该方法,否则回退到`attachEvent`。需要注意的是,当调用这个函数...

    javascript事件侦听器

    element.addEventListener("事件类型", 事件处理函数, 是否使用捕获阶段); ``` - `事件类型`:不包含`on`前缀,例如`click`、`mouseover`。 - `事件处理函数`:当指定的事件发生时被调用的函数。 - `是否使用捕获...

    javascript add event remove event

    在这段代码中,我们定义了一个名为 `addEvent` 的通用函数,它接受三个参数:`obj` 表示要绑定事件的 DOM 元素,`type` 表示事件类型(如 click、mouseover 等),`fn` 表示事件处理函数。该函数首先检查目标对象...

    探究JavaScript中的五种事件处理程序方式

    在JavaScript中,事件处理程序是用于响应用户或浏览器行为的函数。本文将详细阐述JavaScript中的五种事件处理程序方式,帮助开发者更好地理解和使用这些机制。 1. HTML事件处理程序 这是最基础的事件处理方式,通过...

    浅谈JavaScript事件绑定的常用方法及其优缺点分析

    - `this`关键字在事件处理函数中指向触发事件的元素,有助于访问和操作元素。 - **缺点**: - 只支持事件冒泡阶段,不支持事件捕获。 - 一个元素只能绑定一个事件处理函数,新的绑定会覆盖旧的。 - 在非IE浏览...

    js添加事件的通用方法推荐

    其中,`element`是你要添加事件的元素,`eventName`是事件类型(如"click"),`eventHandler`是事件处理函数,`useCapture`是一个可选参数,用于指定事件在捕获阶段还是冒泡阶段执行,默认为`false`。 2. **...

    纯JavaScript实现的兼容各浏览器的添加和移除事件封装

    如果支持,那么就使用`addEventListener`添加事件处理函数,参数包括事件类型(如`'click'`)、处理函数以及是否使用捕获阶段(通常为`false`,表示使用冒泡阶段)。对于不支持`addEventListener`的浏览器(主要是IE...

    JavaScript DOM 添加事件

    这里,`event` 参数指的是需要监听的事件类型(如'click'、'load'等),`function` 是当事件被触发时要执行的函数,`useCapture` 是一个布尔值,指示事件是否在捕获或冒泡阶段执行。通常,为了更好的性能和兼容性,...

    js添加绑定事件的方法

    该方法包含三个参数:事件类型、要绑定的函数和一个布尔值参数,用来指定监听器在捕获阶段还是冒泡阶段执行。示例代码如下: ```javascript function addEvent(element, e, fn) { if (element.addEventListener) {...

    js事件(Event)知识整理

    `type`是事件名称(不带"on"前缀),`listener`是事件处理函数,`useCapture`指定事件是采用冒泡还是捕获(通常用`false`表示冒泡)。 2. `removeEventListener(type, listener, useCapture)`:移除元素上指定类型...

    WebApi面试题.pdf

    也可以编写一个通用的事件监听函数,如:`function addEvent(element, type, handler) { element.addEventListener(type, handler) }`。 8. DOM 和 BOM 的区别 DOM(Document Object Model)是文档对象模型,用于...

Global site tag (gtag.js) - Google Analytics