2010-08-03 35 views
15

¿Cómo controlo solo disparar un evento una vez?¿Solo disparar un evento una vez?

En realidad, una rápida de Google parece aludir al hecho de que .one ayuda ..

+2

Tan pronto como mi representante regrese a más de 3000 voy a c Hange "elude" para "aludir" –

+0

Oh, eso fue ciertamente embarazoso. Gracias por eso. – Qcom

+0

Me alegro de que mi comentario lo haya llamado tu atención –

Respuesta

14

Puede usar jQuery de one method, que suscribirá sólo a la primera ocurrencia de un evento.
Por ejemplo:

$('something').one('click', function(e) { 
    alert('You will only see this once.'); 
}); 
+0

OK, increíble, solo me pregunto, ¿cuál es la 'e' entre tus paréntesis? Además, ¿esta función requiere dos parámetros? 1 por lo que desea ejecutar solo una vez, y el otro por la función? – Qcom

+1

'e' es el parámetro formal del evento para la devolución de llamada. En este caso, no está siendo utilizado. Los dos parámetros son el tipo de evento y la función. –

+0

¡Impresionante! Eso es realmente útil, ¿cuál es la diferencia entre esto y .bind? ¿Es que no necesita ser desatado por algo como .unbind? – Qcom

20

vainilla js

function addEventListenerOnce(target, type, listener) { 
    target.addEventListener(type, function fn(event) { 
     target.removeEventListener(type, fn); 
     listener(event); 
    }); 
} 

addEventListenerOnce(document.getElementById("myelement"), "click", function (event) { 
    alert("You'll only see this once!"); 
}); 

http://www.sitepoint.com/create-one-time-events-javascript/

Editar: modificación inspirado en la versión y la terminología de ling de https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener

Editar 11.23.2016:

once viene a los navegadores. Actualmente en Chrome 55, Firefox 50, Safari 10,1

Y lo usa así:

document.addEventListener(
    'DOMContentLoaded', 
    improveAllTheThings, 
    {once: true} 
); 

https://www.webreflection.co.uk/blog/2016/04/17/new-dom4-standards

3

Igual que la respuesta de rofrol , solo otra forma:

function addEventListenerOnce(element, event, fn) { 
     var func = function() { 
      element.removeEventListener(event, func); 
      fn(); 
     }; 
     element.addEventListener(event, func); 
    } 
0

Además, se puede hacer esto:

window.addEventListener("click", function handleClick(e) { 
    window.removeEventListener("click", handleClick); 

    // ... 
}); 
0

añadido las opciones para añadir/eliminar el detector de eventos:

function addEventListenerOnce(target, type, listener, optionsOrUseCaptureForAdd, optionsOrUseCaptureForRemove) { 
    const f = event => { 
     target.removeEventListener(type, f, optionsOrUseCaptureForRemove); 
     listener(event); 
    } 
    target.addEventListener(type, f, optionsOrUseCaptureForAdd); 
} 
2

sólo tiene que utilizar la opción adecuada en su llamada al método addEventListener:

element.addEventListener(event, func, { once: true }) 
+0

No es compatible con IE. –

Cuestiones relacionadas