简体   繁体   English

事件委托-父元素目标而不是子元素

[英]Event Delegation - Parent Element Target instead of Child Element

I am trying to use & learn Simple Javascript (no JQuery/other libraries/frameworks). 我正在尝试使用和学习简单Javascript(没有JQuery /其他库/框架)。

HTML: HTML:

<div id="name">text</div>
<ul id="namelist"><li>A </li><li>B </li><li>C </li></ul>

and I wrote the below code for event delegation for click and it works fine for A,B,C child elements click handling. 我为事件委托编写了以下代码来进行点击,它对于A,B,C子元素点击处理非常有效。

JS: JS:

<!--
var mainlist = document.getElementById("namelist");
var namefield=document.getElementById("name");
mainlist.addEventListener('click',function(event) {
    console.log(event.currentTarget.id);
    namefield.innerHTML=event.target.innerHTML;
                  console.log( event.target.innerHTML);});-->

However, when I click the "ul" element instead of child li elements, I see all ABC are printed to div. 但是,当我单击“ ul”元素而不是子li元素时,我看到所有ABC都打印到了div。 I don't want any action to take place for ul. 我不想对ul采取任何行动。 Any suggestions ? 有什么建议么 ?

Short Answer 简短答案

var mainlist = document.getElementById("namelist");
var namefield = document.getElementById("name");
mainlist.addEventListener('click', function(event) {
  if(event.target && event.target.nodeName == "LI") {
        console.log(event.currentTarget.id);
        namefield.innerHTML=event.target.innerHTML;
        console.log( event.target.innerHTML);
    }
});

Long Answer 长答案

Your question I feel should be, why the event listener of ul gets fired when I am clicking li. 我觉得您的问题应该是,当我单击li时为什么会触发ul的事件侦听器。

When you are clicking on li, ul also acts as if it is clicked. 当您单击li时,ul也像被单击一样起作用。 It is called event bubbling in javascript and it is by default when you register addEventListener whith no third parameter (defaults to false). 它在javascript中称为事件冒泡,默认情况下,当您注册没有第三个参数的addEventListener时(默认为false)。

Read more here 在这里阅读更多

I will suggest adding event listener on both the elements and then understand the event delegation model. 我建议在两个元素上都添加事件侦听器,然后了解事件委托模型。

Just add a check in your click handler 只需在点击处理程序中添加支票

mainlist.addEventListener('click',function(event) {
    if (event.currentTarget != event.target) {
        console.log(event.currentTarget.id);
        namefield.innerHTML=event.target.innerHTML;
        console.log( event.target.innerHTML);
    }

   });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM