addEventListener 的另类写法

addEventListener 参数如下

1
addEventListener(type, listener[, useCapture]);
  1. type,事件名称
  2. listener,事件处理器
  3. useCapture,是否捕获

一直把 listener 记成是响应函数,function 类型。相信很多人也是这么理解的。多数时候是这么使用

1
2
3
elem.addEventListener('click', function(ev) {
    // todo
}, false);

第一个参数没什么异议,第二个参数传一个 function,第三个参数传 false,事件流为了和低版本IE保持一致(都冒泡)。

 

在读 iscroll.js(5.1.3) 源码时发现还有这样一种写法 

1
2
3
4
5
6
7
8
// _initEvents 863行,方法
eventType(window, 'orientationchange', this);
eventType(window, 'resize', this);
 
// eventType 42行,如下
me.addEvent = function (el, type, fn, capture) {
    el.addEventListener(type, fn, !!capture);
};

 

简化为如下测试代码

1
2
3
4
var obj = {handleEvent: function(ev) {
    console.log(ev)
}}
document.addEventListener('click', obj, false)

  

没错,第二个参数不是 function,而是一个 object。一下糊涂了,世界观一时半会没改变过来。怎么能是一个对象呢?惯性思维和不看规范带来的后患是巨大的。点击文档没有报错,说明确实是可以这么使用的。

 

实际 W3C DOM2 Events 里定义的 listener,没说必须是 function 类型。

Interface EventListener (introduced in DOM Level 2)

只要实现了以上接口就都能作为 listener,简单说只要给对象添加 handleEvent 方法就可以作为 listener了。

 

通过这种方式添加事件的一好处就是当你采用类式开发时 this 能轻松的绑定到当前类上。如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function Component(elem, option) {
    this.elem = elem
    this.handleEvent = function(ev) {
        if (ev.type === 'click') {
            this.updateNav()
        }
        if (ev.type === 'dblclick') {
            this.updateBottom()
        }
    }
    this.init()
}
Component.prototype = {
    init: function() {
        this.elem.addEventlistener('click', this, false)
        this.elem.addEventlistener('dblclick', this, false)
    },
    updateNav: function() {
        console.log('nav update')
    },
    updateBottom: function() {
        console.log('bottom update')
    }
}

 

相关:

https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener

http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget-addEventListener

https://github.com/snandy/e.js

 

posted on   snandy  阅读(4844)  评论(5编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示