为什么DOM级事件处理程序是在冒泡阶段被调用?

0 环境

chrome最新版

1.我在学《JS高程》的DOM0级事件处理程序时,通过event.eventPhase这个接口发现:DOM级事件处理程序是在冒泡阶段被捕获。

2.测试代码

测试代码的仓库位置:https://github.com/AChaoZJU/F...

<!DOCTYPE html>
<html>

<head>
    <style>

    </style>
</head>

<body>
    <button id="myBtn">Love JS</button>

    <script>
        var btn = document.getElementById('myBtn');
        var handle = function() { //添加事件和移除事件的回调函数必须是同一个
            console.log("in target event" + event.eventPhase);
        }
        document.body.onclick = function() {
            console.log("事件冒泡" + event.eventPhase);
        }
        btn.onclick = handle;
    </script>
</body>

</html>

测试结果:
图片描述

我们可以看到打印的event.eventPhase:3,表明事件处理程序是在冒泡阶段被调用。

3 我的问题

可是DOM级事件处理程序难道不应该用的是DOM事件流吗?DOM级事件流不是可以在两个阶段调用事件处理程序吗(事件捕获阶段和事件冒泡阶段)?为什么只在冒泡阶段被调用?

阅读 3.8k
2 个回答

DOM0级发生在冒泡阶段
DOM2级默认发生在冒泡阶段,第三个参数为TRUE则发生在捕获阶段。
高程上写,事件绑定在冒泡阶段可以最大限度兼容各大浏览器。

因为onclick(包括其他onxxxxx)是DOM0级事件是只有在冒泡阶段才能触发的。
等到有DOM2级事件,也就是有addEventListener等才有参数可以判断是在捕获时触发还是冒泡时触发。
虽然,在捕获阶段触发实在太少。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题