La situación es algo así como ...
var someVar = some_other_function();
someObj.addEventListener("click", function(){
some_function(someVar);
}, false);
El problema es que el valor de someVar
no es visible dentro de la función de escucha del addEventListener
, donde probablemente se trata como una nueva variable.
javascript
dom
addeventlistener
Abhishek Yadav
fuente
fuente
Respuestas:
No hay absolutamente nada de malo en el código que ha escrito. Ambos
some_function
ysomeVar
deberían ser accesibles, en caso de que estuvieran disponibles en el contexto donde los anónimosfue creado.
Compruebe si la alerta le da el valor que estaba buscando, asegúrese de que sea accesible en el ámbito de la función anónima (a menos que tenga más código que funcione en la misma
someVar
variable al lado de la llamada aaddEventListener
)fuente
bound function
utilizando este.bind()
método resolverá el problema con los bucles developer.mozilla.org/en/docs/Web/JavaScript/Reference/…¿Por qué no solo obtener los argumentos del atributo de destino del evento?
Ejemplo:
JavaScript es un lenguaje orientado a prototipos, ¡recuerda!
fuente
evt.currentTarget.myParam
? Si hay otro elemento dentro de 'someInput',evt.target
puede referirse al elemento interno. ( jsfiddle.net/qp5zguay/1 )this
! El uso de este método en mecanografiado requiere que el elemento seaany
o para hacer un subtipo.addEventListener
es paradocument
,evt.target.myParam
no funcionó para mí. Tuve que usarevt.currentTarget.myParam
en su lugar.Esta pregunta es antigua, pero pensé que ofrecería una alternativa usando .bind () de ES5 - para la posteridad. :)
Solo tenga en cuenta que necesita configurar su función de escucha con el primer parámetro como argumento que está pasando a vincular (su otra función) y el segundo parámetro es ahora el evento (en lugar del primero, como hubiera sido) .
fuente
Function.prototype.bind()
no puede eliminar el detector de eventos , es mejor usar una función de curry en su lugar (ver respuesta @ tomcek112)some_other_func
es una variable, puede pasar el valor que deseesome_func
.Puede vincular todos los argumentos necesarios con 'vincular':
De esta manera siempre obtendrá el
event
,arg1
y otras cosas pasó amyPrettyHandler
.http://passy.svbtle.com/partial-application-in-javascript-using-bind
fuente
.bind()
pero sin el nulo como primer param. que no funcionónull
, funciona bien con.bind(event, arg1)
, al menos con VueJS.Pregunta bastante antigua, pero tuve el mismo problema hoy. La solución más limpia que encontré es usar el concepto de curry.
El código para eso:
Al nombrar la función curry, le permite llamar a Object.removeEventListener para anular el registro de eventListener en un momento de ejecución posterior.
fuente
Puede agregar y eliminar oyentes de eventos con argumentos declarando una función como variable.
myaudio.addEventListener('ended',funcName=function(){newSrc(myaudio)},false);
newSrc
es el método con myaudio como parámetrofuncName
es la variable de nombre de funciónPuede eliminar el oyente con
myaudio.removeEventListener('ended',func,false);
fuente
Puede pasar somevar por valor (no por referencia) a través de una función de JavaScript conocida como cierre :
O podría escribir una función de ajuste común como
wrapEventCallback
:Aquí
wrapEventCallback(func,var1,var2)
es como:fuente
someVar
El valor debe ser accesible solo ensome_function()
contexto, no desde el oyente. Si le gusta tenerlo dentro del oyente, debe hacer algo como:y usar
newVar
en su lugar.La otra forma es devolver el
someVar
valor desome_function()
para usarlo más en listener (como una nueva var local):fuente
Aquí hay otra forma (esta funciona dentro de los bucles):
fuente
Function.prototype.bind () es la forma de vincular una función de destino a un ámbito particular y, opcionalmente, definir el
this
objeto dentro de la función de destino.O para capturar parte del alcance léxico, por ejemplo en un bucle:
Finalmente, si el
this
parámetro no es necesario dentro de la función de destino:fuente
Utilizar
Y si desea pasar cualquier valor personalizado a esta función anónima, entonces la forma más fácil de hacerlo es
Funciona perfectamente en mi proyecto. Espero que esto ayude
fuente
for
ciclo.Así es como obtuve el evento pasado correctamente.
fuente
Enviar argumentos a una función de devolución de llamada de eventListener requiere crear una función aislada y pasar argumentos a esa función aislada.
Aquí hay una pequeña y agradable función de ayuda que puedes usar. Basado en el ejemplo anterior de "Hola mundo".)
Una cosa que también se necesita es mantener una referencia a la función para que podamos eliminar el oyente limpiamente.
fuente
storeFunc
debería ser tu variable de referencia. Use la eliminación de su escucha en un efecto como este y estará listo:useEffect(() => { return () => { window.removeEventListener('scroll', storeFunc, false); } }, [storeFunc])
Una forma es hacer esto con una función externa :
Este método de ajustar una función anónima entre paréntesis y llamarla de inmediato se llama IIFE (Expresión de función invocada inmediatamente)
Puede consultar un ejemplo con dos parámetros en http://codepen.io/froucher/pen/BoWwgz .
fuente
Si no me equivoco al llamar a la función con, en
bind
realidad se crea una nueva función que elbind
método devuelve . Esto le causará problemas más adelante o si desea eliminar el detector de eventos, ya que es básicamente como una función anónima:Así que tenlo en cuenta.
Si está utilizando ES6, podría hacer lo mismo que se sugiere pero un poco más limpio:
fuente
buena alternativa de una línea
fuente
Pruebe también estos (IE8 + Chrome. No sé para FF):
Espero que no haya errores tipográficos :-)
fuente
Estaba atrapado en esto porque lo estaba usando en un bucle para encontrar elementos y agregarle una lista. Si lo está usando en un bucle, esto funcionará perfectamente
fuente
En 2019, muchos cambios en la API, la mejor respuesta ya no funciona, sin corregir el error.
compartir un código de trabajo
Inspirado por toda la respuesta anterior.
fuente
Hay una variable especial dentro de todas las funciones: argumentos . Puede pasar sus parámetros como parámetros anónimos y acceder a ellos (por orden) a través de la variable de argumentos .
Ejemplo:
fuente
fuente
El siguiente enfoque funcionó bien para mí. Modificado desde aquí .
fuente
La siguiente respuesta es correcta, pero el código siguiente no funciona en IE8 si se supone que comprimió el archivo js usando yuicompressor. (De hecho, todavía la mayoría de los pueblos de EE. UU. Usan IE8)
Entonces, podemos solucionar el problema anterior de la siguiente manera y funciona bien en todos los navegadores
Espero que sea útil para alguien que esté comprimiendo el archivo js en un entorno de producción.
¡¡Buena suerte!!
fuente
El siguiente código funcionó bien para mí (firefox):
Salida:
fuente
Necesitas:
fuente
Probablemente no sea óptimo, pero lo suficientemente simple para aquellos que no son muy expertos. Coloque la función que llama a addEventListener en su propia función. De esa forma, cualquier valor de función que se le pase mantenga su propio alcance y puede iterar sobre esa función tanto como desee.
Ejemplo Trabajé con la lectura de archivos, ya que necesitaba capturar y representar una vista previa de la imagen y el nombre del archivo. Me llevó un tiempo evitar problemas asincrónicos al utilizar un tipo de carga de múltiples archivos. Accidentalmente vería el mismo 'nombre' en todos los renders a pesar de cargar diferentes archivos.
Originalmente, toda la función readFile () estaba dentro de la función readFiles (). Esto causó problemas de alcance asincrónicos.
fuente
solo me gustaría agregar. si alguien está agregando una función que actualiza las casillas de verificación a un detector de eventos, debería usar en
event.target
lugar dethis
actualizar las casillas de verificación.fuente
Tengo un enfoque muy simplista. Esto puede funcionar para otros, ya que me ayudó. Es ... Cuando tiene múltiples elementos / variables asignados a una misma función y desea pasar la referencia, la solución más simple es ...
Eso es. Funcionó para mi. Tan sencillo.
fuente
Otra alternativa, quizás no tan elegante como el uso de bind, pero es válida para eventos en un bucle
Ha sido probado para las extensiones de Google Chrome y quizás e.srcElement debe ser reemplazado por e.source en otros navegadores
Encontré esta solución usando el comentario publicado por Imatoria pero no puedo marcarlo como útil porque no tengo suficiente reputación: D
fuente
Esta solución puede ser buena para mirar
o atar valientes también será bueno
fuente