For some reason, an event listener is fired twice for each element when passing arguments to an anonymous function. For example, the click event on the el element will be logged once and thus will fire once.
el.addEventListener("click", handle, false); el.addEventListener("click", handle, false);
But if I want to pass my own arguments, it will register and run twice.
el.addEventListener("click", function() { handle(event, myArgument); }, false); el.addEventListener("click", function() { handle(event, myArgument); }, false);
The question is why and what is the solution?
I looked elsewhere and cannot find a solution or understand why this problem arises. I tried to implement the solutions in How to pass an argument to the listener function passed to addEventListener? but they didnโt help -
I made a basic anonymous function or closure, and then a more advanced version, shown below, but it really worked.
I donโt understand why passing arguments does not cause the element event to be registered once and passes the arguments, causing the element event to be registered twice.
Here is the 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); </script> </head> <body> <div id="wrapper"> <input id="t1" type="text" /> <input id="btn" type="button" /> </div> </body> </html>
Any help would be greatly appreciated. Thanks.