首先,不要不看手册瞎猜,况且事件根本没有继承一说。
看到这个问题,的确也打破了我之前对事件机制的认识。首先我们知道事件机制分为捕获阶段和冒泡阶段,捕获阶段事件从window一直传播到元素本身,然后开始冒泡阶段,冒泡阶段事件再从元素本身传播到window。下面我们看手册是怎么说的(https://developer.mozilla.org...:
e.preventDefault() 可以在任何阶段阻止事件,并且该方法不会阻止该事件的进一步冒泡。在该例中,a 本身的 click 事件是被触发了的,但当该事件冒泡到递到 div 时,div调用 e.preventDefault() 方法, 该方法将 e.defaultPrevented 修改为 true, 这样当时间传递到 window 时 e.defaultPrevented === true,默认操作不执行。为了验证,这里写段代码验证一下:
var div = document.getElementsByTagName("div")[0];
var a = document.getElementsByTagName("a")[0];
a.onclick = () => {
console.log('click A');
};
div.onclick = (e) => {
console.log('click DIV');
e.preventDefault();
};
window.onclick = (e) => {
console.log('window', e.defaultPrevented);
};
理解这个问题,重要是理解事件周期,你定义了两个事件,其实是一个事件在其传播周期内的两个不同阶段。