首页  >  问答  >  正文

具有未知选择器和子项的 Javascript 事件委托

我有一个动态选择器(linkTrigger),它应该捕获元素上的点击。我不知道 linkTrigger 可能是什么,也不知道它是否会有一些孩子。当我使用 jQuery 时,一切都很好。

如果您单击第一个绿色矩形(不是数字部分),您将看到所有 3 个处理程序按预期工作,但如果您单击第一个绿色矩形中的数字,则只有 jQuery 和 javascript2 处理程序正在工作,再次按预期工作,因为点击绿色框中的span不满足以下条件:

if (e.target.classList.contains(linkTrigger.substring(1))) {

我不能对孩子使用 css point-events none 我不想被点击,因为我不知道 linkTrigger 是什么,我也不想弄乱它的内容.

问题是 javascript2 处理程序不是动态的,这意味着我必须将此处理程序添加到稍后在 dom 内添加的每个新“.a”框。

有更好的解决方案吗?

var linkTrigger = '.c'

//jquery works fine and its live

$('.wrap').on('click', linkTrigger, function(e) {

  var parent = $(this).closest('.a'),
    id = parent.attr('data-id')

  console.log('jquery: ' + id)

})

//javscript works but not if we click on child (number span inside green rectangle) and its live. I cant use **css point-events none** on children I dont want to be clicked because I dont knwo what **linkTrigger** is, neither I want to mess with its contents.

document.querySelector('.wrap').addEventListener('click', function(e){

  if (e.target.classList.contains(linkTrigger.substring(1))) {
    var parent = e.target.closest('.a'),
      id = parent.getAttribute('data-id')

    console.log('js: ' + id)
  }

})

//javscript2 works but its not live, meaning if I add more ".a" containers I have to attach this function call to each item.

document.querySelectorAll(linkTrigger).forEach(function(el){

   el.addEventListener('click', function(e){

       var parent = e.target.closest('.a'),
      id = parent.getAttribute('data-id')

        console.log('js2: ' + id)

   })
})
.a{
  
  width:300px;
  height:300px;
  background:red;
  margin:1px;
  
}
.b{
  
  width:200px;
  height:200px;
  background:blue;
  
}
.c{
  
  width:100px;
  height:100px;
  background:green;
  
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<div class="wrap">

  <div class="a" data-id="0">
    <div class="b">
      <div class="c"><span>657567645</span></div>
    </div>
  </div>

  <div class="a" data-id="1">
    <div class="b">
      <div class="c"></div>
    </div>
  </div>

</div>

P粉187677012P粉187677012179 天前438

全部回复(1)我来回复

  • P粉022285768

    P粉0222857682024-04-04 13:37:49

    event.target 正是您点击的内容。因此,当您单击元素中的跨度时,您将获得跨度,而不是父元素。

    因此,要获得对跨度的点击进行注册,您可以像获取锚标记一样使用closest()。

    var linkTrigger = '.c'
    
    //jquery works fine and its live
    
    $('.wrap').on('click', linkTrigger, function(e) {
    
      var parent = $(this).closest('.a'),
        id = parent.attr('data-id')
    
      console.log('jquery: ' + id)
    
    })
    
    
    
    document.querySelector('.wrap').addEventListener('click', function(e){
    
      if (e.target.closest(linkTrigger)) {
        var parent = e.target.closest('.a'),
          id = parent.getAttribute('data-id')
    
        console.log('js: ' + id)
      }
    
    })
    .a{
      
      width:300px;
      height:300px;
      background:red;
      margin:1px;
      
    }
    .b{
      
      width:200px;
      height:200px;
      background:blue;
      
    }
    .c{
      
      width:100px;
      height:100px;
      background:green;
      
    }
    sssccc
    
    657567645

    回复
    0
  • 取消回复