我有一个动态选择器(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粉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; }
sssccc657567645