LoginSignup
0
1

More than 1 year has passed since last update.

JavaScriptのclassでメソッドをremoveEventListenerしたい

Last updated at Posted at 2021-04-13

JavaScriptのメソッドと関数って何か違うん?
と思っていたがちゃんと違ったので備忘録

ハマったこと

class形式である処理を書いていた時に、addEventListenerでメソッドを実行。
removeEventListenerでメソッドを削除しよーと思ったら削除できなかった。

詳細

addEventListenerは無名関数は削除できないというのは知っていたので
メソッドにスクロールで行いたい処理をまとめて、イベント付与!
removeEventListenerでもメソッド削除できると思っていたらできなかった

HTML
  <button id="btn1">アラート出す</button>
  <button id="btn2">イベント削除</button>
  class Btn {
    constructor(){
      this.alertBtn = document.getElementById('btn1')
      this.removeBtn = document.getElementById('btn2')

      this.addClickEvent()
    }


    addClickEvent() {
      // #btn1を押すとアラートが出る処理を付与
      this.alertBtn.addEventListener('click', this.openAlert)

      // #btn2を押すと#btn1のアラートが出る処理を削除する処理を付与
      this.removeBtn.addEventListener('click', this.removeEvent)
    }

    openAlert() {
      alert('click')
    }

    removeEvent() {
      #btn1のアラートが出る処理を削除
      this.alertBtn.removeEventListener('click', this.openAlert)
    }
  }
  1. #btn1を押す
  2. アラートでる
  3. #btn2を押す
  4. #btn1を押す

4では再度アラートは出ないはずだったが実際は出てる

解決

メソッドはremoveEventListenerできないのでbindを使用してメソッドを実行する関数を作成。
その関数をaddEventListenerしたりremoveEventListenerしたりする

  class Btn {
    constructor(){
      this.alertBtn = document.getElementById('btn1')
      this.removeBtn = document.getElementById('btn2')

      this.addClickEvent()
    }


    addClickEvent() {
      // removeEventメソッドでも使用できるようにしておく
      this.alertBtnEvent = this.openAlert.bind(this)
      this.removeBtnEvent = this.removeEvent.bind(this)

      this.alertBtn.addEventListener('click',  this.alertBtnEvent)
      this.removeBtn.addEventListener('click',  this.removeBtnEvent)
    }

    openAlert() {
      alert('click')
    }

    removeEvent() {
      this.alertBtn.removeEventListener('click', this.alertBtnEvent)
    }
  }

JavaScript難シイね
まんまそのまんまの質問(英語版)
Javascript removeEventListener not working inside a class

bindってそもそも何?ってところからっだので以下を参考にさせていただきました。
ありがとうございます。

-参考
jsのbindは意味がわからない
【JavaScript入門】bindメソッドの使い方をわかりやすく解説!

0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1