Los eventos fundamentalmente sirven para notificar a otras funciones que están «escuchando» esos eventos que algo ha ocurrido. En las aplicaciones web estamos acostumbrados a usar eventos asociados a acciones del usuario como pulsar un botón, mover el ratón, hacer click, … Sin embargo podemos crear nuestros eventos asociados a cualquier acción que deseemos.
Para crear un evento solo necesitamos instanciar un objeto CustomEvent con el nombre del evento:
event = new CustomEvent("event");
Si queremos pasar parámetros tenemos que usar el campo detail:
event = new CustomEvent("event", {
detail: {
value: 1
}
});
El evento debe de ir asociado a un elemento del DOM o al document:
var button = document.getElementById("boton");
button.dispatchEvent(event);
Para «escuchar» un evento usamos addEventListen que asocia el evento a una función que se llama cuando este se dispara:
button.addEventListener("odd", function(e){console.log(e.detail.value);});
La función recibe como parámetro un objeto event con todos los datos del evento. Para acceder a los datos que hemos incluido se puede acceder a valor detail del parámetro.
Veamos un ejemplo completo que convierte un click del ratón en dos eventos uno que se lanza las veces pares y otro las impares:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<button id="boton"> Pulsame </button>
</body>
<script>
var button = document.getElementById("boton");
var clicks = 0;
button.addEventListener("click",
function(e) {
console.log("click");
clicks++;
var event;
if(clicks % 2){
event = new CustomEvent("odd", {
detail: {
value: clicks
}
});
} else {
event = new CustomEvent("even");
}
button.dispatchEvent(event);
});
button.addEventListener("odd", function(e){console.log(e.detail.value);});
button.addEventListener("even", function(e){console.log("even!");});
</script>
</html>
Los eventos permiten una fácil comunicación entre distintas partes de la aplicación. La parte que emite el evento se desvincula de quién está escuchándolo. A su vez los consumidores del evento escuchan o dejan de hacerlo cuando les interesa sin interferir entre ellos.