Qual é a diferença entre bubbling de evento e captura? Quando se deve usar borbulhar vs capturar?
javascript
dom-events
event-bubbling
Arun P Johny
fonte
fonte
Respostas:
Borbulhamento e captura de eventos são duas maneiras de propagação de eventos na API DOM HTML, quando um evento ocorre em um elemento dentro de outro elemento, e os dois elementos registraram um identificador para esse evento. O modo de propagação de eventos determina em qual ordem os elementos recebem o evento .
Com a bolha, o evento é capturado e tratado primeiro pelo elemento mais interno e depois propagado para os elementos externos.
Com a captura, o evento é capturado primeiro pelo elemento mais externo e propagado para os elementos internos.
A captura também é chamada de "gotejamento", o que ajuda a lembrar a ordem de propagação:
Antigamente, a Netscape defendia a captura de eventos, enquanto a Microsoft promovia a bolha de eventos. Ambos fazem parte do padrão W3C Document Object Model Events (2000).
O IE <9 usa apenas a interferência de eventos , enquanto o IE9 + e todos os principais navegadores oferecem suporte a ambos. Por outro lado, o desempenho de bolhas de eventos pode ser um pouco menor para DOMs complexos.
Podemos usar o
addEventListener(type, listener, useCapture)
para registrar manipuladores de eventos no modo de captura (padrão) ou captura. Para usar o modelo de captura, passe o terceiro argumento comotrue
.Exemplo
Na estrutura acima, assuma que ocorreu um evento de clique no
li
elementoNo modelo de captura, o evento será tratado pelo
div
primeiro (clique em manipuladores de eventos nodiv
primeiro será acionado), depois noul
, depois no último no elemento de destinoli
.No modelo de bolhas, o contrário acontecerá: o evento será tratado primeiro pelo
li
, depois peloul
e, finalmente, pelodiv
elemento.Para mais informações, veja
No exemplo abaixo, se você clicar em qualquer um dos elementos destacados, poderá ver que a fase de captura do fluxo de propagação de eventos ocorre primeiro, seguida pela fase de bolhas.
Outro exemplo no JSFiddle .
fonte
useCapture
agora suportada no IE> = 9. fontetriclkling
o mesmo quecapturing
? Crockford fala sobreTrickling v. Bubbling
esta conversa em vídeo - youtube.com/watch?v=Fv9qT9joc0M&list=PL7664379246A246CB ao redor1 hr 5 minutes
.trickle down
=>onElement
=>bubble up
Descrição:
O quirksmode.org tem uma boa descrição disso. Em poucas palavras (copiado do modo quirks):
O que usar?
Depende do que você quer fazer. Não existe melhor. A diferença está na ordem de execução dos manipuladores de eventos. Na maioria das vezes, será bom acionar manipuladores de eventos na fase de bolhas , mas também pode ser necessário acioná-los mais cedo.
fonte
Se houver dois elementos elemento 1 e elemento 2. O elemento 2 está dentro do elemento 1 e anexamos um manipulador de eventos com os dois elementos, digamos onClick. Agora, quando clicarmos no elemento 2, o eventHandler dos dois elementos será executado. Agora, aqui está a pergunta em que ordem o evento será executado. Se o evento anexado com o elemento 1 for executado primeiro, ele será chamado de captura de evento e se o evento anexado com o elemento 2 for executado primeiro, isso será chamado de evento com bolhas. De acordo com o W3C, o evento começará na fase de captura até atingir o objetivo e voltar ao elemento e começar a borbulhar
Os estados de captura e bolha são conhecidos pelo parâmetro useCapture do método addEventListener
Por padrão, useCapture é false. Isso significa que está na fase de bolhas.
Por favor, tente alterar true e false.
fonte
the event will start in the capturing phase untill it reaches the target comes back to the element and then it starts bubbling
. Eu encontrei apenas o addEventListener com o parâmetrouseCapture
que pode ser definido como true ou false; e no HTML 4.0, os ouvintes de eventos foram especificados como atributos de um elemento euseCapture defaults to false
. Você poderia vincular a uma especificação que confirma o que você escreveu?Eu achei este tutorial em javascript.info muito claro ao explicar este tópico. E o seu resumo de 3 pontos no final está realmente falando dos pontos cruciais. Eu cito aqui:
fonte
Há também a
Event.eventPhase
propriedade que pode dizer se o evento está no alvo ou se vem de outro lugar.Observe que a compatibilidade do navegador ainda não foi determinada. Eu testei no Chrome (66.0.3359.181) e Firefox (59.0.3) e é suportado lá.
Expandindo o já ótimo snippet da resposta aceita , esta é a saída usando a
eventPhase
propriedadefonte
Bubbling
Capturando
fonte