事件模型

如题所述

第1个回答  2022-06-15

事件冒泡和事件捕获分别由网景公式和微软公司提出,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题。事件捕获和冒泡是现在浏览器的执行事件的不同阶段,事件委托是利用冒泡阶段的运行机制来实现的

有的时候父元素和子元素都定义了click事件,但是不希望点击子元素的时候执行父元素的click事件,可以通过阻止冒泡(stopPropagation())在子元素上阻止冒泡。

执行顺序不同
事件冒泡:事件会从最内层的元素开始发生,一直向上传播,直到document对象。
事件捕获:事件从最外层开始发生,直到最具体的元素。

打印结果:

结论:
对于非target节点,则先执行捕获再执行冒泡,对于target节点则先执行先注册的事件,无论冒泡还是捕获。
先执行非target节点的捕获,然后根据注册顺序执行target节点的事件,然后再执行非target节点的冒泡。

addEventerListener ,IE8及以下不支持,属于DOM2级的方法,可添加多个方法不被覆盖
解绑事件,参数和绑定相同

绑定事件兼容IE8及以下

由于事件捕获阶段没有可以阻止事件的函数,所以一般都是设置为事件冒泡

e.stopPropagation()
stopPropagation是事件对象(Event)的一个方法,作用是阻止目标元素的冒泡事件,但是不会阻止默认行为。

兼容IE

阻止冒泡兼容IE写法

e.preventDefault()
preventDefault它也是事件对象的一个方法,作用是取消一个目标元素的默认行为,既然说是默认行为,当然只有它有默认行为才能被取消,如果元素本身无默认行为,调用当然无效啦,比如链接a,提交按钮input type="submit"等,当event对象的cancelable为false时,表示没有默认行为,这时即使有默认行为,调用preventDefault也是不会起作用的。
兼容IE: return false;
js的return false只会阻止默认行为,而是用jquery的话则既可以阻止默认行为,有防止对象冒泡。

1、event代表事件的状态,例如触发event对象的元素,鼠标的位置及状态、按下的键等。
2、event对象只在事件发生的过程中才有效
firefox里的event和IE中的不同,IE里的是全局变量,随时可用,firefox里的要用参数引导才能用,是运行时的临时变量。
在IE/Opera中是window.event,在Firefox中是event;而事件的对象,在IE中是window.event.srcElement,在Firefox中是event.target,Opera中两者都可用。