Все ли события в javascript захватывают и всплывают?

Я работаю над проектом, в котором привязываю один eventListener к <audio> элемент для play событие и другой eventListener к его родительскому элементу для того же события. Я заметил, что обратный вызов ребенка всегда вызывается, но обратный вызов родителя никогда не вызывается.

Если я использую режим захвата addEventListener(), тогда оба колбэка вызываются нормально - сначала родительский, потом дочерний.

Для дальнейшего изучения я написал фрагмент кода и обнаружил, что событие play не возвращается к родителю.

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <div><audio src="song.mp3" controls="true"></audio></div>
</body>
<script type="text/javascript">
    parent = document.querySelector('div');
    child = document.querySelector('div audio');

    parent.addEventListener('click', function() {console.log('parent-click-capture');}, true);
    parent.addEventListener('click', function() {console.log('parent-click-bubble');}, false);
    parent.addEventListener('play', function() {console.log('parent-play-capture');}, true);
    parent.addEventListener('play', function() {console.log('parent-play-bubble');}, false);

    child.addEventListener('click', function() {console.log('child-click-capture');}, true);
    child.addEventListener('click', function() {console.log('child-click-bubble');}, false);
    child.addEventListener('play', function() {console.log('child-play-capture');}, true);
    child.addEventListener('play', function() {console.log('child-play-bubble');}, false);
</script>
</html>

И это был выход

parent-click-capture
child-click-capture
child-click-bubble
parent-click-bubble
parent-play-capture
child-play-capture
child-play-bubble

Кто-нибудь знает, относится ли это поведение только к игровому событию или есть другие события, которые не входят в пузырьковую фазу (или фазу захвата)?

1 ответ

Все события JS входят в capture фаза.

Входит ли событие в bubble фазу можно проверить, прочитав событие bubbles собственность

element.addEventListener('ACTION', (e) => console.log(e.bubbles))
Другие вопросы по тегам