2010-04-18 17 views
18

Solo quería obtener el consenso general sobre cuál es un mejor modo de delegación de eventos en JS entre burbujeo y captura.Captura de eventos vs Burbujas de eventos

Ahora entiendo que dependiendo de un caso de uso particular, uno podría querer usar la fase de captura sobre borboteo o viceversa, pero quiero entender qué modo de delegación se prefiere para la mayoría de los casos generales y por qué (para mí parece burbujeante modo).

O para decirlo en otras palabras, ¿hay alguna razón detrás de la implementación de W3C addEventListener para favorecer el modo de burbujeo? [la captura se inicia solo cuando especifica el 3er parámetro y es verdadero. Sin embargo, puede olvidar que el 3er parámetro y el modo de burbujeo están activados]

Busqué la función de vinculación de JQuery para obtener una respuesta a mi pregunta y parece que ni siquiera admite eventos en la fase de captura (parece yo debido a IE no es compatible con el modo de captura).

Parece que el modo de burbujeo es la opción predeterminada, pero ¿por qué?

+0

Posible duplicado de [¿Qué es el evento burbujeando y capturando?] (Https://stackoverflow.com/questions/4616694/what-is-event-bubbling-and-capturing) –

Respuesta

10

En el pasado, era un problema de plataforma, Internet Explorer tenía un modelo de borboteo y Netscape se trataba más de capturar (sin embargo, era compatible con ambos).

El modelo W3C le permite elegir cuál desea.

Creo que el burbujeo es más popular porque, como se mencionó, hay algunas plataformas que solo admiten burbujeo ... y tiene algún sentido como modo "predeterminado".

El que elija es principalmente un producto de lo que está haciendo y lo que tiene sentido para usted.

+3

debido a IE, el burbujeo parece ser la opción predeterminada. aquí es lo que he encontrado en el sitio web prototype.js "Antes de Prototype 1.6, Event.observe apoyaron un cuarto argumento (useCapture), un booleano que indica si se debe utilizar fase de captura del navegador o de su fase de propagación. Desde MSIE no admite la fase de captura, eliminamos este argumento de 1.6, para que no dé a los usuarios la falsa impresión de que pueden usar la fase de captura en todos los navegadores ". [http://api.prototypejs.org/dom/event/observe/] – Rajat

-1

No estoy seguro, pero estoy bastante seguro de que cualquier cosa que pueda hacer con el burbujeo puede hacer con la captura y viceversa.

La idea de que tengas algunos eventos burbujeantes y algunos de captura en la misma aplicación suena como una buena manera de hacer las cosas muy confusas. Lo que estoy diciendo es que no creo que el burbujeo versus la captura realmente importa. Lo que importa es que elijas uno y te apegues a él.

Las API de W3C a menudo contienen este tipo de cosas en las que tienen muchas características que a nadie realmente le interesan. Tal vez este sea otro ejemplo de cómo los buenos valores predeterminados pueden eliminar la necesidad de configuración o incluso características completas.

+3

Los eventos de enfoque/desenfoque no burbujean, pero puede delegarse en un nivel superior durante la fase de captura - http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html –

+1

En otras palabras, el burbujeo no funciona con foco/desenfoque, pero captura hace. Esto es útil para emular el comportamiento del focusin/focusout solo de IE. Las otras diferencias entre el burbujeo y la captura solo surgen cuando desea capturar un evento y evitar que burbujee, etc. – thomasrutter

+1

La captura también es útil si desea renunciar a un controlador en la fase de burbujeo. – sandstrom

1

This test sugiere que existe una ligera ventaja de rendimiento al usar la captura sobre la burbuja. Incluso sin matar el evento tan pronto como se maneja, sin embargo cuando se lo dejó fue marginal. Supongo que un DOM complejo exageraría la diferencia de rendimiento entre los dos.

7

Al leer JavaScript: The Definitive Guide, 5th Edition, me encontré con el ejemplo 17-4 en la página 422 que define una función para arrastrar elementos posicionados de manera absoluta. En el ejemplo, se llama a la función drag() en el atributo onmousedown de un elemento de documento. La función reposiciona el elemento en función del cambio en la ubicación del mouse, que es consultado por los controladores agregados al elemento de documento raíz para los eventos mousemove y mouseup capturados. Capturan estos eventos en el documento por la siguiente razón:

Es importante tener en cuenta que el mousemove y mouseUp manipuladores están registradas pueden ser captura de controladores de eventos debido a que el usuario puede mover el ratón más rápido que el elemento de documento puede seguirlo y algunos de estos eventos ocurren fuera del elemento objetivo original.

Esto sugiere una ventaja en la respuesta más rápida al capturar eventos.

+3

Me parece que están utilizando la captura para estar al frente de los eventos vinculados en la etapa de burbujeo, y no necesariamente debido a la ganancia de rendimiento. – Joel

Cuestiones relacionadas