Javascript addEventListener和removeEventListener与部分函数

Javascript addEventListener和removeEventListener与部分函数,javascript,addeventlistener,partial-application,Javascript,Addeventlistener,Partial Application,我想创建一个javascript函数,在div中添加一个事件监听器,这样当单击div时,它会运行一个函数,并确保该div只能被单击一次。我的函数现在看起来像这样: function clickOnce(divID,func){ var args = Array.prototype.slice.call(arguments,2); functionToRun=partial(func,args); thisDiv=document.getElementById(divID); th

我想创建一个javascript函数,在div中添加一个事件监听器,这样当单击div时,它会运行一个函数,并确保该div只能被单击一次。我的函数现在看起来像这样:

function clickOnce(divID,func){
  var args = Array.prototype.slice.call(arguments,2);
  functionToRun=partial(func,args);
  thisDiv=document.getElementById(divID);
  thisDiv.addEventListener("click",function(e){
    e.target.removeEventListener(e.type, arguments.callee);
    functionToRun();
  });
}
我在JSFIDLE中有一个工作示例:
在JSFIDLE中,当我单击按钮1时,它会显示“按钮2已单击”。

函数运行
(和
thisDiv
,但这与问题无关)是全局的。对
clickOnce
的第二次调用将覆盖
functionorun
,因此两个事件处理程序执行相同的函数


始终声明变量。还要注意的是,它已被弃用。您可以改为使用。

函数运行(和
thisDiv
,但这与问题无关)是全局的。对
clickOnce
的第二次调用将覆盖
functionorun
,因此两个事件处理程序执行相同的函数


始终声明变量。还要注意的是,它已被弃用。您可以改为使用。

您没有声明
函数运行,因此它是隐式全局的。声明它并
thisDiv

var functionToRun=partial(func,args);
var thisDiv=document.getElementById(divID);
然后开始在中工作,这将防止此类问题,并阻止您使用
参数。被调用方
,这是错误的操作方式:

thisDiv.addEventListener("click", function listener(e) {
    thisDiv.removeEventListener("click", listener);
    functionToRun();
});

e.target
也不正确;
这个
会更好。)

您没有声明
函数运行
,因此它是隐式全局的。声明它并
thisDiv

var functionToRun=partial(func,args);
var thisDiv=document.getElementById(divID);
然后开始在中工作,这将防止此类问题,并阻止您使用
参数。被调用方
,这是错误的操作方式:

thisDiv.addEventListener("click", function listener(e) {
    thisDiv.removeEventListener("click", listener);
    functionToRun();
});

e.target
也不正确;
这个
会更好。)

除非您可以使用
let
;然后始终使用
let
;)(在IE11中支持)@Sampson:preference
const
=)除非您可以使用
let
;然后始终使用
let
;)(在IE11中支持)@Sampson:preference
const
=)与
e.target
配合得很好
这是最好的解决方案,但也可以使用
e.currentTarget
e.target
将在元素包含其他元素时立即中断。与
e.target
配合得很好
这是最好的解决方案,但也可以使用
e.currentTarget
<代码>e.目标
将在元素包含其他元素时立即中断。