addEventListener 参数如下

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

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

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

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

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

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

简化为如下测试代码

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能轻松的绑定到当前类上。如下

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

addEventListener 的另类写法的更多相关文章

  1. .net EasyTree显示所级层级(无限级、整层级颗树)的另类写法。非递归

    获取整颗树的另类写法.非递归 //获取所有的菜单 List<T_Menu> menu = bll.getMenuByUsesrID("8189a7c1-6f15-4744-b6c ...

  2. sql查询条件为空的另类写法o( ̄▽ ̄)d

    简单描述:今天看老大提交的代码,发现了一个有意思的事情,一条sql中判断条件是空,老大的写法,让我眼前一亮.直接上代码 代码: <select id="getxxxs" re ...

  3. 巧用style的另类写法

    看到style,不少人可能会说这个我知道,就是控件写属性的话可以通过style来实现代码的复用,单独把这些属性及其参数写成style就可以便捷的调用. <?xml version="1 ...

  4. javascript另类写法

    今天来介绍一下javascript不一样的写法,很简单哦. 1.当条件成立时执行a方法,当条件失败是执行b方法 通常我们会这样写: var result; if(isOk){ result=funA( ...

  5. logstash中output{}的另类写法

    日志传输路径如下: filebeat->redis->logstash->es 在filebeat配置文件中,收集日志的时候配置的有如下参数: fields: log_source: ...

  6. 项目名 的在JSP或JAVA中的另类写法

    在JSP页面中${pageContext.request.contextPath } 表示项目名<form action="${pageContext.request.contextP ...

  7. Tip提示框另类写法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. IN的另类写法

    EXPLAIN SELECT * FROM `tcb_capital_log` WHERE id IN(66,79,47) EXPLAIN SELECT * FROM ( SELECT 66 AS i ...

  9. C# 字节数组和十六进制字符串之间转换的另类写法

    今天从http://www.cnblogs.com/NanaLich/archive/2012/05/24/2516860.html看到的,记录下来 主要是XmlSerializationReader ...

随机推荐

  1. react基础(1)

    在 react入门系列 里面,介绍了一些react的基础知识,在react基础部分,会结合手脚架工具进行更多的总结. 关于webpack我在这里就不讲解了,有需要的小伙伴可以自己去百度一下学习资料,我 ...

  2. iOS 商品倒计时 限时特价 限时优惠 功能的封装

    最近项目中多个页面用到了 商品特价倒计时的功能  为了偷懒 于是自己封装了一个限时抢购 倒计时的view 代码实现如下: 定向价 限时特价 模型代码实现: #pragma mark 商品定向价模型 @ ...

  3. block,inline和inline-block概念和区别

    总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通 ...

  4. 模仿36。杀毒~button

    <Style x:Key="360btn" TargetType="{x:Type Button}"> <Setter Property=&q ...

  5. Android的系统服务一览

    System_Server进程 运行在system server进程中的服务比较多,这是整个Android框架的基础 Native服务 SurfaceFlinger 这是framebuffer合成的服 ...

  6. MVC5 DBContext.Database.SqlQuery获取对象集合到ViewModel集合中(可以利用这个方法给作为前台视图页cshtml页面的@model 源)

    首先我们已经有了一个Model类: using System;using System.Data.Entity;using System.ComponentModel.DataAnnotations; ...

  7. Android Studio :enable vt-x in your bios security,已经打开还是报错的解决方法

    quote: For Windows 10: First of all, install the intelhaxm-android.exe located in the folder SDK\ext ...

  8. Git避免输入用户名和密码

    1. 在系统盘/用户/用户名目录下新建名为 _netrc 的文件: 2. 修改 _netrc 文件内容为“  machine git.mangning.comlogin xxxpassword xxx ...

  9. (HDU 5558) 2015ACM/ICPC亚洲区合肥站---Alice's Classified Message(后缀数组)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5558 Problem Description Alice wants to send a classi ...

  10. Pro HTML5 Programming(Second Edition)2.Canvas API(1)

    1.在使用HTML5的Canvas元素时,考虑到有些浏览器不支持canvas元素,或是不支持HTML5 Canvas API中的某些特性,开发人员最好提供一份替代代码. 以下代码展示如何在canvas ...