#javascript #html #event-propagation
#javascript #HTML #событие-распространение
Вопрос:
В следующем коде, когда я нажимаю на любой элемент, я вижу только одно событие, запускаемое (регистрируемое в консоли) за клик. Из того, что я прочитал, я подумал, что должен увидеть журнал консоли для каждого элемента, который находится под тем местом, где произошел щелчок мыши, из-за распространения события и пузырькования. Похоже, что я получаю событие только для наиболее глубоко вложенного элемента.
Как я могу определить, например, при нажатии на кнопку, какой идентификатор кнопки был нажат, поскольку целью события всегда является дочернее изображение. Должен ли я просто знать структуру HTML и запрашивать e.target.parentNode или есть более элегантный способ доступа к промежуточному узлу в дереве распространения событий?
document.getElementById('parent')
.addEventListener('click', function(e) {
console.log(e.target.nodeName ' ' e.target.id);
});
#parent {
border: thin black solid;
width: 200px;
height: 200px;
}
#child1, #child2 {
border: thin green solid;
width: 100px;
height: 100px;
}
#btn1, #btn2 {
border: thin red solid;
width: 50px;
height: 50px;
}
#image1, #image2 {
width: 100%;
height: 100%;
}
<div id="parent">
<div id="child1">
<button id="btn1">
<img id="image1" src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png">
</button>
</div>
<div id="child2">
<button id="btn2">
<img id="image2" src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png">
</button>
</div>
</div>
Комментарии:
1. Распространение события означает только то, что, когда вы нажимаете (скажем) на элемент,
click
обработчики этого элемента и всех его родителей выполняются по очереди. Но в вашем примере только у#parent
есть обработчик, поэтому когда-либо выполняется только одинconsole.log
. Меня также смущает ваш вопрос о том, как получить идентификатор кнопки, потому что это именно то, что он показывает вам в вашем примере.2. @RobinZigmond … две вещи: Почему целью в конечном итоге является BUTTON, а не, скажем, IMG? И, во-вторых, я предполагаю, что я ожидал / желал поместить обработчик одного щелчка в родительский div, а затем вызвать его несколько раз, причем целевыми элементами будут все дочерние элементы родительского элемента, которые находились под тем местом, где произошел щелчок, чтобы я мог объединить логику в одном месте и решить, что делать, на основе nodeType целевого объекта. Распространение события, вероятно, неправильный термин для этого, возможно, делегирование события или что-то совсем другое?
3. «Почему целью в конечном итоге является BUTTON, а не, скажем, IMG?». На самом деле я получаю изображение, отображаемое каждый раз, когда я нажимаю на кнопку с изображением, а не на кнопку. (И это имеет смысл, поскольку изображение имеет высоту и ширину 100%, поэтому оно занимает точно такую же область.) Что касается другого вопроса, я все еще не совсем понимаю, что вы пытаетесь сделать, но, как показывает ваш пример, вы действительно можете получить информацию о цели, просто из одного обработчика в родительском. Не означает ли это, что вы уже можете «консолидировать логику в одном месте» и «решать, что делать, на основе nodeType целевого объекта»?