我想创建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();
});
}
我在jsfiddle中有一个工作示例:https://jsfiddle.net/qtzLhgr4/1/ 在JSfiddle中,当我点击按钮1时,它会显示"按钮#2点击"。
答案 0 :(得分:3)
您没有声明functionToRun
,因此它是隐式全局的。声明它和thisDiv
:
var functionToRun=partial(func,args);
var thisDiv=document.getElementById(divID);
然后开始使用strict mode,这将阻止这些类型的问题,并阻止您使用arguments.callee
,这是错误的做事方式:
thisDiv.addEventListener("click", function listener(e) {
thisDiv.removeEventListener("click", listener);
functionToRun();
});
(e.target
也不正确; this
会更好。)
答案 1 :(得分:2)
functionToRun
(和thisDiv
,但这与问题无关)是全球性的。第二次调用clickOnce
会覆盖functionToRun
,因此两个事件处理程序都执行相同的功能。
始终声明您的变量。另请注意,arguments.callee
已弃用。您可以改为使用named function expression。