Tengo esta página web con una foto de "Winston".
Hace frío y "Winston" se está haciendo viejo,
así que quiere tener una barba.
Yo podría dibujar la barba.
Pero pienso que sería mejor si el usuario dibuja la barba
de "Winston", de la manera en que quieren que se vea.
Una barba larga, o como de tres días, o lo que sea que definan.
¿Cómo podríamos hacer eso?
Una forma es añadir un detector de eventos para el evento "mouseMove" en la imagen,
de manera que el programa llame a nuestra función cuando el usuario mueva su ratón,
sobre la cara de "Winston".
Vamos a hacer eso usando lo que acabamos de aprender.
El primer paso es encontrar el elemento, la imagen.
"var face = document.getElementById("...
... "face"), porque tengo este lindo "Id".
El segundo paso es definir la función que responde al evento.
Y vamos a empezar con una simple, para asegurarnos de que funciona,
y podremos hacer más tarde que haga algo más.
'document.getElementById("message").textContent += "mooove";'
Ok.
Y el paso final es conectar éste con éste,
para asegurarnos de que éste será llamado cuando éste detecte el evento "mouseMove".
Así que escribiremos: 'face.addEventListener("mousemove",'
y luego le pasamos el nombre de nuestra función, "onMouseMove".
Ahora, pausa esta guía paso a paso, y trata de mover el ratón sobre la cara.
¿Viste el mensaje?
Ok, espero que hayas visto este evento funcionando.
Pero esto no es lo que queremos que haga nuestro detector de eventos.
Queremos que dibuje, no que escriba texto.
¿Cómo podemos dibujar en una página web?
Podríamos usar la etiqueta "" y dibujar pixeles, como lo hicimos aquí
con los programas de "ProcessingJS".
Pero todo lo que estamos dibujando es una barba, que en realidad es un montón de puntos negros.
Así que podríamos crear un "" para cada punto, y asignar a este ""
un posicionamiento absoluto.
Aquí, se los voy a mostrar con un folículo de barba.
Entonces, voy a hacer un "" con una clase "beard", y luego voy a estilizar la barba con algo lindo de CSS
que voy a pegar aquí.
Y vamos a arreglar eso.
Así que puedes ver que nuestra barba tiene un fondo negro, es de 5 por 5 pixeles,
tiene un borde de 2 pixeles de radio, para hacerlo un poco más redondo,
y está usando un esquema de posicionamiento absoluto.
Actualmente, el "" se muestra debajo de la imagen.
¿Cómo podemos hacer para que se muestre sobre la cara?
Estamos usando posicionamiento absoluto, eso significa que deberíamos usar
las propiedades "top" y "left" para decirle, en realidad, dónde
debería posicionarse, ya que es posicionamiento absoluto.
Así que vamos a poner "top: 80px;", y luego "left: 15px;".
Hermoso.
Ahora que logramos que funcionara en HTML, vamos a hacer que funcione en JavaScript,
para que el usuario pueda crear dinámicamente este "" cada vez que mueva su ratón.
Vamos a ir abajo a nuestra función de JavaScript que responde al evento.
El primer paso es crear un "",
que podemos hacer con nuestra función "document.createElement()",
esto va a ser un "".
El segundo paso es añadir la clase: 'beard.className = "beard";'.
Así que ahora tenemos este "" flotando en el espacio.
El paso final es anexarlo a "".
Muy bien, ahora hicimos en JavaScript básicamente lo que habíamos hecho en HTML,
así que podemos borrar este HTML.
Ahora, deberías pausar la guía paso a paso, y probar presionar el ratón en "Winston".
Observa lo que pasa.
¿Viste que apareciera el folículo de barba?
¿Y trataste de presionar el ratón varias veces?
Si lo hiciste, probablemente notaste que la segunda vez que presionaste el ratón no pasó nada,
o cuando menos parece que no pasó nada.
Esto es porque cada "" tiene las mismas propiedades "top" y "left",
así que las nuevas barbas aparecen sobre las que ya estaban.
Queremos que "" se muestre donde quiera que el usuario presione el ratón.
¿Cómo podemos saber dónde se encuentra el ratón?
Como resultado, el navegador registra una gran cantidad de información
cada vez que sucede cualquier evento del usuario.
Y el navegador te da información cada vez
que se llama a la función de detector de eventos.
Pero ¿dónde y cómo podemos obtener esa información increíble?
Voy a teclear una letra, para darles un pista.
Esta "e" aquí, es el objeto de la información del evento.
Y el navegador lo envía como el primer argumento cuando llama
una función del detector de eventos.
No lo necesitamos antes, así que no me molesté en escribir la lista de argumentos.
Pero ahora que lo vamos a usar, le estoy dando un nombre, para que sea fácil
hacer referencia dentro de la función.
Recuerden que en JavaScript, una función puede ser llamada con cualquier número
de argumentos, incluso si la función no los usa o no se refiere a ninguno de ellos.
Así que siempre estábamos obteniendo esta información, sólo que no lo sabíamos.
Ahora voy a sacar la "e" a la consola: "console.log(e)".
Pausa la guía paso a paso, presiona el ratón en "Winston", y revisa tu consola.
Deberías poder ver el objeto del evento,
y leer todas sus propiedades.
Hay dos propiedades del evento que nos interesan en particular:
"clientX" y "clientY".
Estos registran la "x" y la "y" del evento y eso es lo que vamos a usar
para posicionar la barba.
Vamos a definir la propiedad "top" de la barba igual a "e.clientY" más "px", para las unidades.
Y establecer "left" igual a "e.clientX", más "px" para las unidades.
Ahora usa la pausa y trata de pasar el ratón por encima.
Dibujale una barba a "Winston".
Bastante bien, ¿eh?
Apuesto que pueden imaginar lo divertidas que pueden ser las aplicaciones de pintura que pueden hacer,
usando "clientX" y "clientY".
Y como lo viste en la consola, hay muchas propiedades
en un objeto de evento que podrías usar también.
Yo creo que las más utilizadas son las relacionadas con el teclado.
Entonces podrías descubrir cuáles teclas está presionando el usuario
cuando sucede un evento, y usar eso para hacer una
interfaz de teclado o en realidad un juego muy divertido.
Oh, una cosa más:
no tienes que llamar "e" a este argumento forzosamente.
Típicamente se hace, pero algunos desarrolladores lo llaman "evt" o "event".
No importa cómo lo llames, siempre y cuando se esté refiriendo
al primer argumento que el navegador pasa en tu función,
y siempre y cuando tú te refieras a él más tarde de la misma manera.
Si tienes problemas con esto, asegúrate de usar " console.log"
para ayudarte a depurar lo que está pasando.
Cuando eres un desarrollador web,
la consola es por mucho tu mejor amiga, ¡úsala!