addEventListener 中 事件用bind指向this 后,无法移除事件问题

addEventListener 中 事件用bind指向this 后,无法移除事件问题

今天写BUG的时候,要在一个touchstart事件内添加 touchmove和touchend的事件注册。

然后,在touchend的时候再把2个事件给移除了。

之前一直不是很在意bind,apply,call一些细节的的我就在这里吃了亏,果然出来混的迟早要还的。

代码如下:

dom.addEventListener('touchstart', fTouchstart.bind(this));
function fTouchstart(e) {
    console.log('start:' + e, this); // TouchEvent对象,实例对象
    dom.addEventListener('touchmove', fTouchmove.bind(this));
    dom.addEventListener('touchend', fTouchend.bind(this));
}

function fTouchmove(e) {
    console.log(‘move:’ + e, this); // TouchEvent对象,实例对象
    dom.removeEventListener('touchmove', fTouchmove);
    dom.removeEventListener('touchend', fTouchend);
}

然后在浏览器上换成移动端在dom上点击几次,你会发现end事件执行次数之后每次会递增1。


原因:

bind方法返回了一个新的函数。在removeEventListener中移除的事件并没有绑定在TouchEvnent上,绑定上去的是bind()方法每次返回的函数。


解决方法:

在外面保存bind()返回函数的引用。

修改上面代码:

// 保存引用
var fTouchstart_ = fTouchstart.bind(this),
    fTouchmove_ = fTouchmove.bind(this),
    fTouchend_ = fTouchend.bind(this);

dom.addEventListener('touchstart', fTouchstart_);
function fTouchstart(e) {
    console.log('start:' + e, this); // TouchEvent对象,实例对象
    dom.addEventListener('touchmove', fTouchmove_);
    dom.addEventListener('touchend', fTouchend_);
}

function fTouchmove(e) {
    console.log(‘move:’ + e, this); // TouchEvent对象,实例对象
    dom.removeEventListener('touchmove', fTouchmove_);
    dom.removeEventListener('touchend', fTouchend_);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,581评论 1 11
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,286评论 0 21
  • 13.1 事件流 “DOM2级事件”规定事件流包括3个阶段:事件捕获阶段,处于目标阶段,事件冒泡阶段。事件捕获表示...
    Elevens_regret阅读 480评论 0 0
  • 事件流分为两种,捕获事件流和冒泡时间流 捕获事件流:从根节点出发开始执行,一直往子节点查找执行,直到查到到根节点。...
    路上灵魂的自由者阅读 421评论 0 0
  • JavaScript 与 HTML 之间的交互是通过事件实现的。事件,就是文档或浏览器窗口中发生的一些特定的交互瞬...
    LemonnYan阅读 703评论 0 4