如何在javascript中删除事件监听器?

我想知道如何添加一个事件监听器,你在jquery中使用on和off的方式?

document.removeEventListener('touchstart'); document.addEventListener('touchstart', function (e) { closePopupOnClick(e, popup); }); 

但这实际上并没有删除事件监听器。 如果我将addEventListener代码放在一个函数中并将该函数传递给removeEventListener它将无法工作bc你不能将params传递给函数。 有人知道怎么做吗?

将侦听器作为变量并通过.addEventListener附加

 var myListener = function (e) { closePopupOnClick(e, popup); }; document.addEventListener('touchstart', myListener, true); 

然后在使用.removeEventListener删除时再次传递它

 document.removeEventListener('touchstart', myListener); 

如果你没有处于严格模式,你可以使用arguments.callee使监听器自行删除

 document.addEventListener('touchstart', function (e) { closePopupOnClick(e, popup); document.removeEventListener('touchstart', arguments.callee); }, true); 

如果您处于严格模式,则必须使用命名函数表达式,如果您希望函数删除自身

 document.addEventListener('touchstart', function myListener(e) { closePopupOnClick(e, popup); document.removeEventListener('touchstart', myListener); }, true); 

如果你想在监听器中使用可能被某些东西改变的变量(例如循环),那么你可以编写一个生成器函数,例如

 function listenerGenerator(popup) { return function (e) { closePopupOnClick(e, popup); }; } 

现在,您可以使用listenerGenerator(popup)创建侦听器,它将调整popup变量的范围。 请注意,如果popup是一个对象 ,它将是ByRef ,因此可能仍会受到更改。