Eu li o artigo em https://developer.mozilla.org/en/DOM/element.addEventListener, mas não consigo entender o useCapture
atributo. Definição existe:
Se verdadeiro, useCapture indica que o usuário deseja iniciar a captura. Após o início da captura, todos os eventos do tipo especificado serão despachados para o ouvinte registrado antes de serem despachados para qualquer EventTargets abaixo dele na árvore DOM. Eventos que estão subindo pela árvore não acionam um ouvinte designado para usar a captura.
Nesse evento pai de código é acionado antes do filho, portanto, não consigo entender seu comportamento. O objeto de documento tem usecapture true e child div tem usecapture definido false e a usecapture é seguida. Portanto, por que a propriedade document é preferida a child.
function load() {
document.addEventListener("click", function() {
alert("parent event");
}, true);
document.getElementById("div1").addEventListener("click", function() {
alert("child event");
}, false);
}
<body onload="load()">
<div id="div1">click me</div>
</body>
fonte
no specification is made as to the order in which they will receive the event with regards to the other EventListeners on the EventTarget
. Eu não testei todos os navegadores; portanto, eles podem implementá-lo da mesma maneira. Os eventos de captura, no entanto, serão feitos antes dos eventos de não captura.Acho que este diagrama é muito útil para entender as fases de captura / destino / bolha: http://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases
Abaixo, o conteúdo extraído do link.
Fases
O evento é despachado seguindo um caminho da raiz da árvore para este nó de destino. Em seguida, ele pode ser manipulado localmente no nível do nó de destino ou nos ancestrais de qualquer destino mais alto na árvore. O envio de eventos (também chamado de propagação de eventos) ocorre em três fases e na seguinte ordem:
Os ancestrais do destino são determinados antes do envio inicial do evento. Se o nó de destino for removido durante o envio, ou o ancestral de um destino for adicionado ou removido, a propagação do evento sempre será baseada no nó de destino e nos ancestrais do destino determinados antes do envio.
Alguns eventos podem não necessariamente realizar as três fases do fluxo de eventos do DOM, por exemplo, o evento pode ser definido apenas para uma ou duas fases. Como exemplo, os eventos definidos nesta especificação sempre realizarão as fases de captura e destino, mas alguns não a fase de bolha ("eventos de bolha" versus "eventos de não bolha", consulte também o atributo Event.bubbles).
fonte
Window
, em vez dedocument
, porquedocument
é filhaWindow
?Evento de captura (
useCapture = true
) vs Evento de bolha (useCapture = false
)Referência MDN
useCapture
parâmetro não importa (obrigado @bam e @ legend80s)stopPropagation()
vai parar o fluxoDemo
Resultado:
Bolha alvo 1
(Como o Capture e o Bubble of Target serão acionados na ordem em que foram registrados, o evento Bubble será acionado antes do evento Capture)
Captura de Alvos
fonte
Events in the target phase will trigger all listeners on an element in the order they were registered, regardless of the useCapture parameter.
De developer.mozilla.org/en-US/docs/Web/API/EventTarget/… . Portanto, não existe fase de "Children Capture" e "Children Bubble".Quando você diz useCapture = true, os Eventos são executados de cima para baixo na fase de captura, quando false, ele faz um balão de baixo para cima.
fonte
É tudo sobre modelos de eventos: http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow Você pode capturar um evento na fase de bolhas ou na fase de captura. Sua escolha.
Dê uma olhada em http://www.quirksmode.org/js/events_order.html - você achará muito útil.
fonte
Exemplo de código:
Código Javascript:
se ambos estiverem configurados para false
Executa: Ao clicar em Div interno, os alertas são exibidos como: Div 2> Div 1
Aqui, o script é executado a partir do elemento interno: Event Bubbling (useCapture foi definido como false)
div 1 é definido como true e div 2 é definido como false
Executa: Ao clicar em Div interno, os alertas são exibidos como: Div 1> Div 2
Aqui, o script é executado a partir do elemento ancestral / externo: Captura de Eventos (useCapture foi definido como true)
div 1 é definido como false e div 2 é definido como true
Executa: Ao clicar em Div interno, os alertas são exibidos como: Div 2> Div 1
Aqui, o script é executado a partir do elemento interno: Event Bubbling (useCapture foi definido como false)
div 1 é definido como true e div 2 é definido como true
Executa: Ao clicar em Div interno, os alertas são exibidos como: Div 1> Div 2
Aqui, o script é executado a partir do elemento ancestral / externo: Captura de Eventos desde que useCapture foi definido como true
fonte
Resumo:
A
DOM
especificação descrita em:https://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases
funciona da seguinte maneira:
Um evento é despachado seguindo um caminho da raiz (
document
) da árvore para o nó de destino . O nó de destino é oHTML
elemento mais profundo , ou seja, o event.target. O envio de eventos (também chamado de propagação de eventos) ocorre em três fases e na seguinte ordem:document
) para o pai direto do nó de destino.html
elemento mais profundo no qual o evento foi despachado.Exemplo:
O exemplo acima ilustra realmente a diferença entre a bolha de eventos e a captura de eventos. Ao adicionar ouvintes de eventos
addEventListener
, existe um terceiro elemento chamado useCapture. Issoboolean
quando definido comotrue
permite que o ouvinte de eventos use a captura de eventos em vez de bolhas de eventos.Em nosso exemplo, quando configuramos o argumento useCapture
false
, vemos que ocorre a bolha de eventos. Primeiro, o evento na fase de destino é disparado (registra innerBubble) e, em seguida, através do evento borbulhante, o evento no elemento pai é disparado (registra outerBubble).Quando configuramos o argumento useCapture
true
, vemos que o evento externo<div>
é acionado primeiro. Isso ocorre porque o evento agora é disparado na fase de captura e não na fase de bolhas.fonte
Dadas as três fases da viagem do evento :
useCapture
indica em quais fases a viagem do evento estará:A origem é igual à segunda melhor resposta: https://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases
fonte
A ordem da definição é importante apenas se os itens estiverem no mesmo nível. Se você reverter a ordem da definição no seu código, obterá os mesmos resultados.
No entanto, se você reverter a configuração useCapture nos dois manipuladores de eventos, o manipulador de eventos filho responderá antes do pai. A razão para isso é que o manipulador de eventos filho agora será acionado na fase de captura anterior à fase de bolhas na qual o manipulador de eventos pai será acionado.
Se você definir useCapture como true para os dois manipuladores de eventos, independentemente da ordem da definição, o manipulador de eventos pai será acionado primeiro porque ocorre antes do filho na fase de captura.
Por outro lado, se você definir useCapture como false para os dois manipuladores de eventos - novamente independentemente da ordem de definição - o manipulador de eventos filho será acionado primeiro porque ocorre antes do pai na fase de bolhas.
fonte