Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 事件委派-父元素目标而不是子元素_Javascript_Html - Fatal编程技术网

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

Javascript 事件委派-父元素目标而不是子元素,javascript,html,Javascript,Html,我正在尝试使用和学习简单的Javascript(没有JQuery/其他库/框架) HTML: 文本 ABC 我为click的事件委派编写了下面的代码,对于A、B、C子元素click处理,它可以很好地工作 JS: 但是,当我单击“ul”元素而不是子li元素时,我看到所有ABC都打印到div。我不希望ul发生任何操作。 有什么建议吗?简短回答 var mainlist = document.getElementById("namelist"); var namefield = document

我正在尝试使用和学习简单的Javascript(没有JQuery/其他库/框架)

HTML:

文本
  • A
  • B
  • C
我为click的事件委派编写了下面的代码,对于A、B、C子元素click处理,它可以很好地工作

JS:


但是,当我单击“ul”元素而不是子li元素时,我看到所有ABC都打印到div。我不希望ul发生任何操作。
有什么建议吗?

简短回答

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);
    }
});
长答案

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);
    }
});
你的问题我觉得应该是,为什么ul的事件监听器在我点击li时被解雇

当您单击li时,ul也会表现为单击它。 在javascript中,它被称为事件冒泡,当您注册addEventListener时,默认情况下不使用第三个参数(默认为false)

阅读更多


我建议在这两个元素上添加事件侦听器,然后了解事件委派模型。

只需在单击处理程序中添加一个检查

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);
    }

   });
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);
    }

   });