객체 지향 프로그래밍 removeEventListener를 작성하는 방법
10318 단어 신인 프로그래머 응원자바스크립트EventListener
이번에는 객체 지향 프로그래밍 버전.
실패 예
class X {
click(e) {
// thisがオブジェクトXを指すようにしたい
console.log('click', this, e.currentTarget);
}
add() {
document.addEventListener('click', (e) => this.click(e));
}
remove() {
document.removeEventListener('click', (e) => this.click(e));
}
}
var x = new X();
x.add();
x.remove();
(()=>{}) === (()=>{})
또는 (function(){}) === (function(){})
가 false를 반환하기 때문에 removeEventListener에 익명 함수를 사용할 수 없습니다.
addEventListener로 지정한 함수와 같은 함수를 removeEventListener로 지정할 수 없기 때문에 이벤트 청취자를 삭제할 수 없다.
이벤트 리스너 함수에 this.click
를 지정하면 removeEventListener로 삭제할 수 있지만 this가 document를 가리키고 e.currentTarget도 document를 가리키므로 중복됩니다.
객체 지향 프로그래밍에서 이벤트 리스너 함수를 쓸 수 없다?
여기에서 한 시간 동안 고민했다.
성공 예 1 (bind)
class X {
constructor() {
this.event_listeners = {};
}
click(e) {
// thisがオブジェクトXを指すようにしたい
console.log('click', this, e.currentTarget);
}
add() {
this.event_listeners.click = this.click.bind(this);
document.addEventListener('click', this.event_listeners.click);
}
remove() {
document.removeEventListener('click', this.event_listeners.click);
}
}
var x = new X();
x.add();
x.remove();
함수에 this를 bind 1 하고, 그 함수를 저장해 쓰면 좋다고 생각한다.
성공 예 2 (handleEvent)
모든 이벤트를 포착하는 handleEvent() 라는 특별한 함수가 존재했다. 2
handleEvent를 사용하면 어떻게 될까.
class X {
click(e) {
// thisがオブジェクトXを指すようにしたい
console.log('click', this, e.currentTarget);
}
add() {
document.addEventListener('click', this);
}
remove() {
document.removeEventListener('click', this);
}
handleEvent(e) {
if (e.type === 'click' && e.currentTarget === document) {
this.click(e);
}
}
}
var x = new X();
x.add();
x.remove();
이 방법으로 이벤트 리스너를 삭제할 수 있습니다
객체 x
의 모든 이벤트가 하나의 함수 handleEvent
에 집약되므로 객체의 이벤트가 많아질 때 디버그하기 쉬워질지도 모른다.
this.event_listeners.click = (e) => this.click(e)
라고 써도 좋다. addEventListener 가 this 를 바꾸기 때문에 this.event_listeners.click = function (e) { this.click(e) }
라고는 쓸 수 없다. ↩
EventTarget.addEventListener() - Web API | MDN ↩
Reference
이 문제에 관하여(객체 지향 프로그래밍 removeEventListener를 작성하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/querykuma/items/77367cda587c799b2c20
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
class X {
click(e) {
// thisがオブジェクトXを指すようにしたい
console.log('click', this, e.currentTarget);
}
add() {
document.addEventListener('click', (e) => this.click(e));
}
remove() {
document.removeEventListener('click', (e) => this.click(e));
}
}
var x = new X();
x.add();
x.remove();
class X {
constructor() {
this.event_listeners = {};
}
click(e) {
// thisがオブジェクトXを指すようにしたい
console.log('click', this, e.currentTarget);
}
add() {
this.event_listeners.click = this.click.bind(this);
document.addEventListener('click', this.event_listeners.click);
}
remove() {
document.removeEventListener('click', this.event_listeners.click);
}
}
var x = new X();
x.add();
x.remove();
함수에 this를 bind 1 하고, 그 함수를 저장해 쓰면 좋다고 생각한다.
성공 예 2 (handleEvent)
모든 이벤트를 포착하는 handleEvent() 라는 특별한 함수가 존재했다. 2
handleEvent를 사용하면 어떻게 될까.
class X {
click(e) {
// thisがオブジェクトXを指すようにしたい
console.log('click', this, e.currentTarget);
}
add() {
document.addEventListener('click', this);
}
remove() {
document.removeEventListener('click', this);
}
handleEvent(e) {
if (e.type === 'click' && e.currentTarget === document) {
this.click(e);
}
}
}
var x = new X();
x.add();
x.remove();
이 방법으로 이벤트 리스너를 삭제할 수 있습니다
객체 x
의 모든 이벤트가 하나의 함수 handleEvent
에 집약되므로 객체의 이벤트가 많아질 때 디버그하기 쉬워질지도 모른다.
this.event_listeners.click = (e) => this.click(e)
라고 써도 좋다. addEventListener 가 this 를 바꾸기 때문에 this.event_listeners.click = function (e) { this.click(e) }
라고는 쓸 수 없다. ↩
EventTarget.addEventListener() - Web API | MDN ↩
Reference
이 문제에 관하여(객체 지향 프로그래밍 removeEventListener를 작성하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/querykuma/items/77367cda587c799b2c20
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
class X {
click(e) {
// thisがオブジェクトXを指すようにしたい
console.log('click', this, e.currentTarget);
}
add() {
document.addEventListener('click', this);
}
remove() {
document.removeEventListener('click', this);
}
handleEvent(e) {
if (e.type === 'click' && e.currentTarget === document) {
this.click(e);
}
}
}
var x = new X();
x.add();
x.remove();
Reference
이 문제에 관하여(객체 지향 프로그래밍 removeEventListener를 작성하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/querykuma/items/77367cda587c799b2c20텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)