Javascript 事件监听器 - 在事件完成冒泡后运行代码

标签 javascript events event-handling mouseevent addeventlistener

例如,我想在事件结束后运行一些代码来冒泡 DOM

    document.getElementById("myBtn").addEventListener("click", (event) => {
       // run some code after event finish to bubble up
});

最佳答案

你至少有两个选择:

  1. 排队异步任务(setTimeout 或 Promise 解析)

  2. 处理 document 上的事件,但前提是它在到达它的途中通过#myBtn;这在技术上不是完全完成冒泡,只是在它的最后阶段

请注意,某些必须响应用户事件(例如打开窗口)的操作可能适用于也可能不适用于 #1。

这是使用 Promise 的#1:

document.getElementById("myBtn").addEventListener("click", (event) => {
    Promise.resolve().then(_ => {
        // Do the work here
    });
});

使用 promise 解决方案的优势在于,在兼容的浏览器上,promise 解决方案将在任何其他排队事件之前运行。 ( promise 决议是在当前任务之后但在下一个任务之前运行的微任务。)

这是#2:

document.addEventListener("click", (event) => {
    var node = event.target;
    while (node.id !== "myBtn") {
        if (node === document.body) {
            return; // Didn't pass through #myBtn
        }
        node = node.parentNode;
    }
    // Do the work here
});

关于Javascript 事件监听器 - 在事件完成冒泡后运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43885599/

相关文章:

javascript - PHP获取选择表单的选定值

c# - 检测窗体何时关闭 C#

java - 将滚动条监听器添加到 JOGL 项目

javascript - 我可以更改 JavaScript 中的事件队列优先级吗?

javascript - 重定向到用户来自的页面

c++ - 有没有办法在qt中卸载eventfilter?

python - 自定义 kivy 事件问题

java - 如何在JFrame中排列,升序,降序,冒泡,输入区域,输出区域

javascript - .includes() 检查 prompt() 中的关键字

Android- (button.Click += event;) 和 (button.SetOnClickListener(this)) 之间有什么区别?