2011-02-02 16 views
15

Me pregunto si es posible forzar a un detector de eventos javascript, sin que la condición sea verdadera, forzarlo a ejecutar una vez y luego continuar escuchando para ver si se cumple su condición de ejecutar más.forzar javascript EventListener para ejecutar una vez?

+0

"sin que la condición sea verdadera" ... ¿qué condición? Además, si se dispara una vez, entonces continúe escuchando, luego, presumiblemente, vuelva a disparar, luego ... no está disparando una vez. ¿A menos que quiera decir que solo quiere procesar 1 evento a la vez (no múltiples eventos simultáneos)? – KOGI

+0

¿Estás usando un framework de JavaScript? Creo que en ExtJS es posible. En jQuery quizás también. – Marc

+0

jQuery tiene un método .one(), pero no estoy seguro si es bastante lo que estás buscando. Aunque, podría volver a vincular el evento en el controlador. Esto tendría el efecto de no manejar eventos simultáneos, luego de que el controlador esté completo, comience a escuchar el evento nuevamente. http://api.jquery.com/one/ – KOGI

Respuesta

0

si se coloca el código en una función, simplemente llame a la función de carga de la página

editado añadir ejemplo:

sé qué su evento sea pero aquí está un ejemplo:

<a ..onclick='someFunction()'>click</a> 

<script type='text/javascript'> 
function someFunction() { 
    // do whatever 
} 

// call the function 
someFunction(); 
</script> 
+0

si necesita que la función esté en un contexto particular, puede usar el método de jQuery's proxy() http://api.jquery.com/jQuery.proxy/ – KOGI

-1

Si entiendo tu pregunta correctamente, solo quieres manejar un evento a la vez (si un evento se dispara varias veces en una sucesión rápida, solo quieres manejar uno de ellos), una vez que el manejador esté completo, continuarás escuchando más eventos. ¿Correcto?

jQuery tiene una .one() método api.jquery.com/one

Sólo se controla el evento de una vez, pero si vuelve a unirse al evento en el controlador, entonces funcionará como desea.

function handler() 
{ 
    // do stuff 

    $(this).one('click', handler); 
} 

$('.someElement').one('click', handler); 
34
var clickFunction = function (event) { 
    //do some stuff here 
    window.removeEventListener('click',clickFunction, false); 

}; 
window.addEventListener("click", clickFunction, false); 

Esto le permitirá disparar el clickFunction una vez, ya que la magia de cierre de dejar que el removeEventListener encontrar el clickFunction.

No necesita usar una biblioteca solo para hacer que algo simple se haga.

+0

Esto rápidamente se convierte en un problema si necesita usar este patrón más de dos veces en un código Esto es muy común en contextos de animación css donde tienes una animación "hook transitionend, set change, make transitionend remove them", y muchas veces tienes que encadenarla. Un patrón similar a http://hastebin.com/ikixonajuk.coffee es mucho más fácil de mantener. En NodeJS se llama simplemente "una vez". – Dmitry

+0

1. en 2011 cuando la respuesta se publicó originalmente, una vez no estaba disponible. 2. es una pregunta de implementación del lado del cliente en la pregunta original, por lo que nodejs no es útil 3. su script de café es esencialmente la misma idea con una ligera modificación. – Jlam

+1

una vez está disponible ahora en el navegador a través de o todavía tenemos que inventarlo/usar bibliotecas de terceros hinchadas para ello? – Dmitry

Cuestiones relacionadas