2016-08-12 71 views
0

我想創建javascript函數將一個事件監聽器添加到一個div,這樣當div被點擊時,它會運行一個函數,並確保div只能被點擊一次。我的功能看起來像現在這種權利:Javascript addEventListener和removeEventListener與部分功能

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點擊」。

回答

2

functionToRun(和thisDiv,但這與問題無關)是全球性的。第二次調用clickOnce覆蓋functionToRun,所以兩個事件處理程序都執行相同的功能。

總是聲明你的變量。另請注意,arguments.callee已棄用。您可以改用named function expression

+0

除了當你可以使用'let';然後總是使用'let';)(在IE11中支持) – Sampson

+0

當然:D(編輯) –

+0

@Sampson:首選'const' =) – Ryan

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會更好。)

+0

與'e.target'搭配很好。 'this'是最好的解決方案,但也可以使用'e.currentTarget'。只要元素包含其他元素,「e.target」就會中斷。 –