首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将removeEventListener应用于类中的(作用域) addEventListener?

如何将removeEventListener应用于类中的(作用域) addEventListener?
EN

Stack Overflow用户
提问于 2018-12-18 01:47:15
回答 1查看 57关注 0票数 0

在全局范围内,可以删除eventListener。下一段代码可以显示所需的行为;第一个按钮触发变量,而第二个按钮不会。

代码语言:javascript
复制
window.addEventListener('load', () => {
  const button1 = document.getElementById('button-1');
  const button2 = document.getElementById('button-2');
  
  button1.addEventListener('click', helloAlert);
  
  button2.addEventListener('click', helloAlert);
  button2.removeEventListener('click', helloAlert);
});

function helloAlert(){
  window.alert('hello');
};
代码语言:javascript
复制
<button id='button-1'>addEventListener</button>
<button id='button-2'>addEventListener & removeEventListener</button>

在OOP的情况下,我最终会遇到这样的情况。

代码语言:javascript
复制
window.addEventListener('load', () => {
  let button1 = document.getElementById('button-1');
  let messenger1 = new Messenger( button1, 'hello 1' );
  messenger1.addHelloAlert();
  
  let button2 = document.getElementById('button-2');
  let messenger2 = new Messenger( button2, 'hello-2' );
  messenger2.addHelloAlert();
  messenger2.removeHelloAlert();
});

class Messenger{

  constructor( button, message ){
    this.button = button;
    this.text = message;
  }
  
  addHelloAlert(){
    this.button.addEventListener('click', this.giveMessage.bind(this));
  }
  
  removeHelloAlert(){
    // this is where I get stuck because 
    // I cannot reference to the relevant function 
    // to remove the eventListener
    this.button.removeEventListener('click', this.giveMessage );
  }
  
  giveMessage(){
    window.alert( this.text );
  };
}
代码语言:javascript
复制
<button id='button-1'>addEventListener</button>
<button id='button-2'>addEventListener & removeEventListener</button>

如您所见,eventListener没有被OOP代码删除,因为函数没有被选中。

任何有想法的人如何在、正则JavaScript、和OOP中解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-18 01:49:39

一种选择是在构造函数中bind this.giveMessage处理程序,这样以后就可以随意添加和删除它,而无需进一步绑定,就像在涉及处理程序时的React这样的框架中经常看到的那样:

代码语言:javascript
复制
class Messenger {
  constructor(button, message) {
    this.button = button;
    this.text = message;
    this.giveMessage = this.giveMessage.bind(this);
  }

  addHelloAlert() {
    this.button.addEventListener('click', this.giveMessage);
  }

  removeHelloAlert() {
    this.button.removeEventListener('click', this.giveMessage);
  }

  giveMessage() {
    console.log(this.text);
  };
}

let button1 = document.getElementById('button-1');
let messenger1 = new Messenger(button1, 'hello 1');
messenger1.addHelloAlert();

let button2 = document.getElementById('button-2');
let messenger2 = new Messenger(button2, 'hello-2');
messenger2.addHelloAlert();
messenger2.removeHelloAlert();
代码语言:javascript
复制
<button id='button-1'>addEventListener</button>
<button id='button-2'>addEventListener & removeEventListener</button>

如果出于某些原因(例如封装/隐私),不希望将绑定侦听器附加到实例,则另一个选项是将绑定侦听器分配给外部作用域Map

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53825303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档