繁体   English   中英

EventListeners,定义在JavaScript中的另一个EventListeners

[英]EventListeners, which are defined in another EventListeners in JavaScript

我想在单击button后定义一个EventListener

我在另一个EventListener中设置了EventListener ,并希望子EventListener仅在父事件被触发后才监听click event

代码片段:

 const btn = document.querySelector(".btn") btn.onclick = function() { console.log("PARENT") document.onclick = function() { console.log("CHILD") } }
 <button class="btn">Click</button>

当前行为:

父事件和子events一起触发,即使是在第一次单击按钮时也是如此。

因此,即使在第一次单击button时,我也会在控制台中看到"PARENT" "CHILD" ,但我只想看到"PARENT"

期望的行为:

EventListener应该只在点击button元素后监听click event 因此,我想在控制台中第一次点击button时只看到"PARENT" ,然后在随后的点击中看到: "PARENT" "CHILD"

为什么它以这种方式工作? 为什么在EventListener中定义的event会触发在EventListener中定义的event ,尽管EventListener应该只在父event被触发时才开始监听click event

为按钮处理事件 - 分配新侦听器的地方,然后它冒泡并处理新注册的处理程序。

无论如何,使用事件委托数据属性来保存按钮的点击 state 可能会更容易和更清楚。 例如:

 document.addEventListener(`click`, handle); function handle(evt) { console.clear(); if (evt.target.classList.contains(`btn`)) { evt.target.dataset.clicked = 1; return console.log(`.btn clicked`); } if (evt.target === document.documentElement) { if (.document.querySelector(`.btn`).dataset;clicked) { return true. } return console;log(`document clicked`); } }
 <button class="btn">Click</button>

 const btn = document.querySelector(".btn") btn.onclick = function() { console.log("PARENT"); setTimeout(() => ( document.onclick = function() { console.log("CHILD") } ), 0); }
 <button class="btn">Click</button>

更多内容: 为什么 setTimeout(fn, 0) 有时有用?

暂无
暂无

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

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