DOM:事件响应链

事件响应链

 

 

1.事件的三个阶段: 先捕获,后目标,再冒泡,只能有一个阶段触发程序执行,比如捕获阶段触发了到了冒泡阶段就不再触发

事件经过所有元素都没有被处理,这个事件消失

事件传递的过程 只跟文档树的结构有关系 跟界面显示的层叠效果没有任何关系

 

事件冒泡:

结构上(非视觉上)嵌套关系的元素,会存在事件冒泡的功能,即同一事件,自子元素冒泡向父元素。(自底向上)

事件捕获:

结构上(非视觉上)嵌套关系的元素,会存在事件捕获的功能,即同一事件,自父元素捕获至子元素(事件源元素)。(自顶向下)

2.默认在冒泡的时候执行事件:onclick/attach和 addEventListener传false的时候

3.addEventListener绑定事件,如果把第三个参数设置为true,则在捕捉的时候执行事件

3.整个事件处理过程,会有个event事件对象在整个事件过程传播(W3C标准,ie8及其以下没有)

4.ie8以下不支持addEventListener

5.focus,blur,change,submit,reset,select等事件不冒泡

 

阻止冒泡和系统默认事件

 

addEventListener第三个参数 :true捕获阶段触发 false冒泡阶段触发

 

1、阻止事件冒泡:

W3C标准 event.stopPropagation();但不支持 ie9以下版本

*但不能阻止默认的跳转页面的系统事件

stopImmediatePropagation() 支持stopPropagation的浏览器中也可以用stopImmediatePropagation()方法,这个不仅会阻止事件向祖元素的冒泡,也会阻止同一个节点上同一事件的其他的事件处理程序(优先级比它低的,同元素同事件多处理程序时)

event.cancelBubble=true; ie8及ie8以下可用

2、阻止默认事件:

默认事件——表单提交,a标签跳转,右键菜单等等

return false; 以对象属性的方式注册的事件才生效,用addEventListener/attachEvent这种是不生效的

event.preventDefault(); W3C标准,IE9以下不兼容

*可以阻止默认事件

event.returnValue=false;兼容IE

 

stopPropagation()、stopImmediatePropagation()和preventDefault()区别:

stopPropagation()、stopImmediatePropagation()阻止不了默认的跳转页面的系统事件

 

易错点:阻止冒泡 设计让监听器在捕获阶段运行 等等 都是指同一个事件

问:addEventListener 的第三个参数为true,是阻止事件传递还是false?

答:都不会阻止事件传递,因为true捕获阶段触发 false冒泡阶段触发

要阻止事件传递的唯一方式是:阻止事件冒泡——事件对象调用stopPropagation()

 

优化方案:?

 

posted on 2022-07-20 11:10  香香鲲  阅读(30)  评论(0编辑  收藏  举报