从内部函数中删除侦听器

时间:2016-03-15 11:26:10

标签: javascript javascript-events this addeventlistener

JS是否可以从其他地方描述的函数内部删除侦听器,然后传递给侦听器?

我希望这样的事情有效,但它不是(我的意思是行self.removeEventListener("blur", named, false);)。在调试模式下,我看到this值正确传递。

someElement.addEventListener("blur", function namedFunc() {handler(this)} ,false);

function handler(self) {
    self.removeEventListener("blur", namedFunc, false);
}

2 个答案:

答案 0 :(得分:2)

名称 namedFunction仅显示inside that function。因此,您需要将其传递给处理程序,以便以后可以将其删除。

var someElement = document.getElementById('foo');

someElement.addEventListener('click', function namedFunc() {
    handler(this, namedFunc);
}, false);

function handler(self, fn) {
    alert('handler called');
    self.removeEventListener('click', fn, false);
}
<button id="foo">click me!</button>

答案 1 :(得分:1)

您可以扩大处理程序的范围。

有关问题的详细解释,请参阅Yoshi's post

function listenOnce(el, eventName, handler)  {
   var wrapper = function(e) {
       handler.apply(this, arguments);
       el.removeEventListener(eventName, wrapper);
   }
   el.addEventListener(eventName, wrapper, false);
}

listenOnce( document.getElementById('foo'), 'click', function() {
  alert('handler called');
});

请注意,您正在做的事情可以抽象

CI_Session