JavaScript事件处理模型 — 事件冒泡、捕获

悠悠 2022-05-19 01:22 445阅读 0赞

事件冒泡

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

事件捕获

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

触发顺序

先捕获,后冒泡 focus,blur,change,submit,reset,select 等事件不冒泡

0_1293708442iQ1z.gif

例子: CodePen链接

这里有3个嵌套的div,每一个div都绑定了一个点击时间

  1. <div class="outer">
  2. <div class="center">
  3. <div class="inner"></div>
  4. </div>
  5. </div>
  6. var oOuter = document.getElementsByClassName('outer')[0];
  7. var oCenter = document.getElementsByClassName('center')[0];
  8. var oInner = document.getElementsByClassName('inner')[0];
  9. var isCatchStyle = false;
  10. oOuter.addEventListener('click', function(){
  11. console.log('outer');
  12. }, isCatchStyle);
  13. oCenter.addEventListener('click', function(){
  14. console.log('center');
  15. }, isCatchStyle);
  16. oInner.addEventListener('click', function(){
  17. console.log('inner');
  18. }, isCatchStyle);

70 这三个重叠的div从内到外分别为 inner,center,outer

我们知道,addEventListener(type, function , isCatchStyle)方法的第三个参数设置为true就在捕获过程中执行,反之就在冒泡过程中执行处理函数。

当第三个参数是false,事件在冒泡过程被捕获,我们点击最内层绿色div,可以看到绑定事件的执行顺序是从内向外的。

70 1

当第三个参数是true,事件在捕获过程被触发,我们点击最内层绿色div,可以看到绑定事件的执行顺序是从外向内的。

70 2

取消冒泡和阻止默认事件

取消冒泡:

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

event.cancelBubble = true;

封装取消冒泡的函数 stopBubble(event)

  1. function stopBubble(event){
  2. if(event.stopPropagation){
  3. event.stopPropagation();
  4. } else {
  5. event.cancelBubble = true;
  6. }
  7. }

阻止默认事件:

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

1.return false; 以对象属性的方式注册的事件才生效
例子: 右键点击页面执行一个函数但不执行默认事件(出现菜单)

  1. document.oncontextmenu = function (){
  2. console.log('a');
  3. return false;
  4. }

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

3.event.returnValue = false; 兼容IE 封装阻止默认事件的函数 cancelHandler(event);

封装一个方法,记住方法调用完了在外面还是要return false;

  1. function cancelHander(event){
  2. if(event.preventDefault){
  3. event.preventDefault();
  4. } else {
  5. event.returnValue = false;
  6. }
  7. }

阻止a标签的跳转和跳到页面顶部的常用写法:

  1. <a href="javascript:void(false)">点我没反应</a>

发表评论

表情:
评论列表 (有 0 条评论,445人围观)

还没有评论,来说两句吧...

相关阅读

    相关 javaScript事件捕获冒泡

            事件是先捕获,后冒泡。从最外层向内逐层捕获直到目标(target),再逐层向上冒泡直到<html>标签。所有事件处理程序都会忽略捕获阶段,而在事件冒泡阶段触发事

    相关 浅析JavaScript事件捕获事件冒泡

    一、什么是事件流? 事件,是文档或浏览器窗口中发生的一些特定的交互瞬间。事件流,描述的是页面中接收事件的顺序。 一个事件被触发后,一般会有三个不同的阶段:捕获阶段、目标