Javascript addEventListener和removeEventListener与部分函数
我想创建一个javascript函数,在div中添加一个事件监听器,这样当单击div时,它会运行一个函数,并确保该div只能被单击一次。我的函数现在看起来像这样: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
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:preferenceconst
=)除非您可以使用let
;然后始终使用let
;)(在IE11中支持)@Sampson:preferenceconst
=)与e.target
配合得很好这是最好的解决方案,但也可以使用e.currentTarget
e.target
将在元素包含其他元素时立即中断。与e.target
配合得很好这是最好的解决方案,但也可以使用e.currentTarget
<代码>e.目标
将在元素包含其他元素时立即中断。