2016-08-12 2 views
0

Je veux créer une fonction javascript ajoute un écouteur d'événement à un div de telle sorte que lorsque le div est cliqué, il exécute une fonction, et assure que le div ne peut être cliqué qu'une seule fois. Ma fonction ressemble à ce moment:Javascript addEventListener et removeEventListener avec fonction partielle

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(); 
    }); 
} 

J'ai un exemple de travail en jsFiddle: https://jsfiddle.net/qtzLhgr4/1/ Dans le jsFiddle, lorsque je clique sur le bouton 1, il dit « bouton # 2 cliqué ».

Répondre

2

functionToRun (et thisDiv, mais ce n'est pas lié au problème) est global. Le deuxième appel à clickOnce remplace functionToRun, donc les deux gestionnaires d'événements exécutent la même fonction.

Toujours déclarer vos variables. Notez également que arguments.callee est obsolète. Vous pouvez utiliser un named function expression à la place.

+0

Sauf quand vous pouvez utiliser 'let'; alors toujours utiliser 'let';) (supporté par IE11) – Sampson

+0

Bien sûr: D (édité) –

+0

@Sampson: Préférez' const' =) – Ryan

3

Vous n'avez pas déclaré functionToRun, donc il est implicitement global. Déclarer et thisDiv:

var functionToRun=partial(func,args); 
var thisDiv=document.getElementById(divID); 

Puis commencer à travailler dans strict mode, ce qui empêchera ce genre de problèmes aussi bien que vous empêcher d'utiliser arguments.callee, qui est la mauvaise façon de faire les choses:

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

(e.target était également incorrect, this aurait été mieux.)

+0

Bonne capture avec 'e.target'. 'this' est la meilleure solution, mais on pourrait aussi utiliser' e.currentTarget'. 'e.target' se casse dès que l'élément contient d'autres éléments. –