javascript - 事件委托(delegate) : catch event on Element not its children

标签 javascript html css

HTML

  <section id='mainwrap'>
  .. 
  ....
  ......
  <section class='innerwrap'>
    <div>123</div>
    <div>123</div>
    <div>123</div>
    <div>123</div>
    <div>123</div>
    <div>123</div>
    <div>123</div>
  </section>
 .....
 ....
...
</section>

此处section innerwrap 是在应用程序中动态添加的。我已将事件委托(delegate)给 ma​​inwrap 部分(静态)。

问题:我无法section innerwrap捕获点击事件......被点击的元素是它的子 div。

JS

document.getElementById('mainwrap').addEventListener('click',handler,false);

function handler(e){
  event = e || window.event;
  var target = e.target || e.scrElement;
  var cls = target.className;
  
  
  console.log(target,cls);
  if(cls === 'innerwrap'){
   console.log('my right element clicked');
  }
  
}  
  
.innerwrap{
  border:2px solid #ddd;
  position:relative;
  z-index:1;
  display:inline-block;
}

.innerwrap > div{
  border:1px solid #efefef;
  position:relative;
  z-index:0;
  display:inline-block;
  margin-right:-4px;
 }
  <section id='mainwrap'>
  <section class='innerwrap'>
    <div>123</div>
    <div>123</div>
    <div>123</div>
    <div>123</div>
    <div>123</div>
    <div>123</div>
    <div>123</div>
  </section>
</section>

最佳答案

您需要爬文档树直到找到正确的元素:

document.getElementById('mainwrap').addEventListener('click',handler,false);

function handler(e){
  e = e || window.event;
  var element = e.target || e.srcElement;

  while (element.className !== "innerwrap" && element !== this) {
    element = element.parentNode;
  }

  if(element.className === 'innerwrap'){
    console.log('my right element clicked');
  }
}

event.target 属性始终是被点击的最深的元素,因此您只需要继续查看 parentNode 直到找到正确的元素。

关于javascript - 事件委托(delegate) : catch event on Element not its children,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26220425/

相关文章:

html - 打印 css 选择器匹配除一个元素之外的所有元素

jquery - 无法将图像放在文本旁边

html - 将 flexbox 侧边栏的最大高度设置为永远不会超过其他框

javascript - javascript改变可见性的元素不可点击

javascript - 取消不会在 angularjs 中切换 ngHide

javascript - JavaScript 中的日期比较失败

css - 我店里的响应式 CSS 问题

javascript - 将自定义按钮添加到传单 map

Javascript Twitter 无法在一台主机上运行,​​但可以在另一台主机上运行

javascript - 向用户呈现多条确认消息的最佳方式