ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript – 删除使用bind(this)添加的事件侦听器

2019-06-07 12:22:11  阅读:248  来源: 互联网

标签:javascript ecmascript-6 addeventlistener custom-element removeeventlistener


如何在下面的构造函数中删除绑定到窗口的单击侦听器?我需要它来监听窗口,我需要访问其中的按钮实例.

class MyEl extends HTMLButtonElement {
  constructor() {
    super();
    this.clickCount = 0;
    window.addEventListener('click', this.clickHandler.bind(this));
  }
  
  clickHandler(e) {
    if (e.target === this) {
      this.textContent = `clicked ${++this.clickCount} times`;
      window.removeEventListener('click', this.clickHandler);
    }
  }
  
  disconnectedCallback() {
      window.removeEventListener('click', this.clickHandler);
  }
}

customElements.define('my-el', MyEl, { extends: 'button' });
<button is="my-el" type="button">Click me</button>

解决方法:

你当前的实现是不可能的 – 每次调用.bind都会创建一个新的独立函数,如果传递的函数与传递给addEventListener的函数相同(===),你只能调用removeEventListener来删除一个监听器(就像.includes用于数组,或.has用于集合):

const fn = () => 'foo';
console.log(fn.bind(window) === fn.bind(window));

作为解决方法,您可以将绑定函数分配给实例的属性:

class MyEl extends HTMLButtonElement {
  constructor() {
    super();
    this.clickCount = 0;
    this.boundListener = this.clickHandler.bind(this);
    window.addEventListener('click', this.boundListener);
  }
  
  clickHandler(e) {
    this.textContent = `clicked ${++this.clickCount} times`;
    window.removeEventListener('click', this.boundListener);
  }
}

customElements.define('my-el', MyEl, { extends: 'button' });
<button is="my-el" type="button">Click me</button>

标签:javascript,ecmascript-6,addeventlistener,custom-element,removeeventlistener
来源: https://codeday.me/bug/20190607/1193634.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有