¿Cuál es la diferencia entre burbujear y capturar eventos? ¿Cuándo se debe usar burbujear frente a capturar?
javascript
dom-events
event-bubbling
Arun P Johny
fuente
fuente
Respuestas:
El burbujeo y la captura de eventos son dos formas de propagación de eventos en la API DOM de HTML, cuando ocurre un evento en un elemento dentro de otro elemento, y ambos elementos han registrado un identificador para ese evento. El modo de propagación de eventos determina en qué orden los elementos reciben el evento .
Con el burbujeo, el elemento primero captura y maneja el evento y luego lo propaga a los elementos externos.
Con la captura, el evento es capturado primero por el elemento más externo y propagado a los elementos internos.
La captura también se llama "goteo", lo que ayuda a recordar el orden de propagación:
En los viejos tiempos, Netscape abogó por la captura de eventos, mientras que Microsoft promovió el burbujeo de eventos. Ambos son parte del estándar de eventos del modelo de objetos de documento del W3C (2000).
IE <9 solo usa burbujeo de eventos , mientras que IE9 + y todos los principales navegadores admiten ambos. Por otro lado, el rendimiento del burbujeo de eventos puede ser ligeramente inferior. para los DOM complejos.
Podemos usar el
addEventListener(type, listener, useCapture)
para registrar controladores de eventos en modo burbujeante (predeterminado) o de captura. Para usar el modelo de captura, pase el tercer argumento comotrue
.Ejemplo
En la estructura anterior, suponga que se produjo un evento de clic en el
li
elemento.En el modelo de captura, el evento será manejado por el
div
primero (haga clic en los controladores de eventos en eldiv
disparará primero), luego en elul
, luego al último en el elemento de destino,li
.En el modelo burbujeante, sucederá lo contrario: el evento será manejado primero por el elemento
li
, luego por el elementoul
y finalmentediv
.Para más información, ver
En el siguiente ejemplo, si hace clic en cualquiera de los elementos resaltados, puede ver que la fase de captura del flujo de propagación del evento ocurre primero, seguida de la fase de burbujeo.
Otro ejemplo en JSFiddle .
fuente
useCapture
ahora compatible con IE> = 9. fuentetriclkling
lo mismo quecapturing
? Conversaciones sobre CrockfordTrickling v. Bubbling
en esta charla de vídeo - youtube.com/watch?v=Fv9qT9joc0M&list=PL7664379246A246CB alrededor1 hr 5 minutes
.trickle down
=>onElement
=>bubble up
Descripción:
quirksmode.org tiene una buena descripción de esto. En pocas palabras (copiado de quirksmode):
¿Qué usar?
Depende de lo que quieras hacer. No hay mejor La diferencia es el orden de ejecución de los controladores de eventos. La mayoría de las veces estará bien disparar controladores de eventos en la fase de burbujeo , pero también puede ser necesario dispararlos antes.
fuente
Si hay dos elementos, elemento 1 y elemento 2. El elemento 2 está dentro del elemento 1 y adjuntamos un controlador de eventos con ambos elementos, digamos onClick. Ahora, cuando hacemos clic en el elemento 2, se ejecutará eventHandler para ambos elementos. Ahora aquí la pregunta es en qué orden se ejecutará el evento. Si el evento adjunto con el elemento 1 se ejecuta primero, se llama captura de eventos y si el evento adjunto con el elemento 2 se ejecuta primero, esto se llama burbujeo de eventos. Según el W3C, el evento comenzará en la fase de captura hasta que alcance el objetivo, regrese al elemento y luego comience a burbujear
Los estados de captura y burbujeo son conocidos por el parámetro useCapture del método addEventListener
Por defecto useCapture es falso. Significa que está en la fase de burbujeo.
Por favor, intente cambiar verdadero y falso.
fuente
the event will start in the capturing phase untill it reaches the target comes back to the element and then it starts bubbling
. Solo encontré que addEventListener tiene el parámetrouseCapture
que se puede establecer en verdadero o falso; y en HTML 4.0, los detectores de eventos se especificaron como atributos de un elemento yuseCapture defaults to false
. ¿Podría vincular a una especificación que confirme lo que escribió?He encontrado este tutorial en javascript.info para ser muy claro al explicar este tema. Y su resumen de 3 puntos al final realmente está hablando de los puntos cruciales. Lo cito aquí:
fuente
También existe la
Event.eventPhase
propiedad que puede decirle si el evento está en el destino o si proviene de otro lugar.Tenga en cuenta que la compatibilidad del navegador aún no está determinada. Lo probé en Chrome (66.0.3359.181) y Firefox (59.0.3) y es compatible allí.
Ampliando el fragmento ya excelente de la respuesta aceptada , esta es la salida que usa la
eventPhase
propiedadfuente
Burbujeante
Capturar
fuente