la méthode addEventListener tir plusieurs fois pour la même poignée lors du passage dans des disputes avec fonction anonyme
Pour une raison quelconque, l'écouteur d'événement est déclenché deux fois pour chaque élément lors du passage d'arguments dans une fonction anonyme. I. e., l'événement click sur l'élément el
va enregistrer une fois et, par conséquent, le feu une fois.
el.addEventListener("click", handle, false);
el.addEventListener("click", handle, false);
Mais si je veux passer mes propres arguments, il va s'inscrire et le feu deux fois.
el.addEventListener("click", function() { handle(event, myArgument); }, false);
el.addEventListener("click", function() { handle(event, myArgument); }, false);
La question est de savoir pourquoi et quelle est la solution?
J'ai regardé ailleurs et n'arrive pas à trouver une solution ou à comprendre pourquoi ce problème est survenu. J'ai essayé de mettre en œuvre les solutions dans Comment passer d'un argument à la fonction écouteur passé à la méthode addEventListener? mais ils n'ont pas d'aide --
J'ai fait la base anonyme de la fonction ou de la fermeture puis la version la plus avancée, qui est illustré ci-dessous, mais il a fait un travail.
Je ne comprends pas pourquoi en passant pas les arguments des causes de l'élément de l'événement à enregistrer une fois et de passer des arguments à l'provoquant l'élément de l'événement à inscrire deux fois.
Voici le code:
<html>
<head>
<script type="text/javascript">
var handle_2 = function(evt, type) {
var test;
switch (type) {
case "focus":
console.log(evt.target.value);
break;
case "click":
console.log(evt.target.id + " was clicked");
break;
default: console.log("no type found");
}
};
window.onload = function() {
var textbox = document.getElementById("t1");
var button = document.getElementById("btn");
textbox.value = "456";
button.value = "Press";
var typeFocus = "focus", typeClick = "click";
textbox.addEventListener("focus", (function(typeFocus) { return function(evt) { handle_2(evt, typeFocus); }})(typeFocus), false);
button.addEventListener("click", (function(typeClick) { return function(evt) { handle_2(evt, typeClick); }})(typeClick), false);
//Registers again for each element. Why?
textbox.addEventListener("focus", (function(typeFocus) { return function(evt) { handle_2(evt, typeFocus); }})(typeFocus), false);
button.addEventListener("click", (function(typeClick) { return function(evt) { handle_2(evt, typeClick); }})(typeClick), false);
};
</script>
</head>
<body>
<div id="wrapper">
<input id="t1" type="text" />
<input id="btn" type="button" />
</div>
</body>
</html>
Toute aide serait appréciée. Merci.
- Pourquoi êtes-vous encore en appelant
el.addEventListener
deux fois? - C'est à l'extérieur de la portée de la discussion. Il a à faire avec certains vendeur code, je travaille sur.
Vous devez vous connecter pour publier un commentaire.
La solution la plus simple est de créer le nouveau gestionnaire d'une seule fois:
el.removeEventListener("click", newHandle)
, ou?Bien,
Registres de la même fonction "handle()"
Registres "fonction() { handle(événement, myArgument)"... qui sont deux fonctions anonymes. Ainsi, il mettra le feu à deux reprises.
Bien que je ne comprenez pas pourquoi vous désirez vous inscrire à deux reprises, la solution serait de créer une fonction de retour de votre fonction qui prend en paramètres.
Il n'est toujours pas à résoudre le feu à deux reprises problème bien que.
el.addEventListener("click", crateHandle(myArgument), false);
est appelée deux fois.addEventListener
registres comme de nombreux auditeurs, car il est utilisé.Selon la la documentation il prend 3 arguments, le troisième est
useCapture
qui n'a rien à voir avec l'enregistrement d'auditeur deux fois ou pas. Il est par défaut àfalse
, donc, l'ajout defalse
d'un troisième paramètre ne change pas beaucoup.If multiple identical EventListeners are registered on the same EventTarget with the same parameters, the duplicate instances are discarded. They do not cause the EventListener to be called twice, and since the duplicates are discarded, they do not need to be removed manually with the removeEventListener method.
addEventListener
qu'une seule fois.var handler2 = function() { handler(....); };
et utilisez cette fonction à la place.