removeEventListener в загруженном аддоне не работает, когда аддон отключен
Я заметил, что после отключения начальной загрузки, removeEventListener
кажется, не удаляет слушателя, и я не могу понять причину.
let contextMenu = window.document.getElementById('contentAreaContextMenu');
if (contextMenu) {
contextMenu.addEventListener('popupshowing',
this.contextPopupShowing.bind(this), false);
// added this to make sure they refer to the same function
console.log(this.contextPopupShowing.toString());
}
А потом при отключении аддона
console.log(this.contextPopupShowing.toString()); // same as above
this.contextMenu.removeEventListener('popupshowing',
this.contextPopupShowing.bind(this), false);
// just showing that 'this' is working
this.contextMenu.removeChild(this.menuitem);
В заключение...
contextPopupShowing: function() {
// logs even after removeEventListener
console.log('contextPopupShowing called');
// more code
},
1 ответ
Решение
Потому что это bind
"Ред. Что ты должен сделать, это:
При добавлении:
let contextMenu = window.document.getElementById('contentAreaContextMenu');
if (contextMenu) {
this.contextPopupShowingBound = this.contextPopupShowing.bind(this);
contextMenu.addEventListener('popupshowing',
this.contextPopupShowingBinded, false);
// added this to make sure they refer to the same function
console.log(this.contextPopupShowing.toString());
}
А потом при отключении аддона
console.log(this.contextPopupShowing.toString()); // same as above
this.contextMenu.removeEventListener('popupshowing',
this.contextPopupShowingBound, false);
// just showing that 'this' is working
this.contextMenu.removeChild(this.menuitem);
В заключение...
contextPopupShowing: function() {
// logs even after removeEventListener
console.log('contextPopupShowing called');
// more code
},
Вы не можете использовать bind
в removeEventListener
, Я точно уверен.
Смотрите эту превосходную тему по теме: Удаление прослушивателя событий, который был добавлен с помощью bind