js中事件三阶段

先贴代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>冒泡</title>
<style>
#a{
width: 300px;
height:300px;
background-color: cadetblue;
}
#b{
width: 200px;
height:200px;
background-color: chocolate;
}
#c{
width: 100px;
height:100px;
background-color: coral;
}
</style>
</head>
<body>
<div id="a">
<div id="b">
<div id="c"></div>
</div>
</div>
<script src="mainx.js"></script>
</body>
</html>
/**
* Created by Administrator on 2016/8/10.
*/
(function () { var a=document.getElementById("a");
var b=document.getElementById("b");
var c=document.getElementById("c"); a.addEventListener("click",function () {
console.log("a is clicked");
});
b.addEventListener("click",function () {
console.log("b is clicked");
});
c.addEventListener("click",function () {
console.log("c is clicked");
}); })();

运行结果如图:

当点击最小块c的时候,a和b也会被点击。也就导致了所谓的冒泡。

当js代码修改为

/**
* Created by Administrator on 2016/8/10.
*/
(function () { var a = document.getElementById("a");
var b = document.getElementById("b");
var c = document.getElementById("c"); a.addEventListener("click", function () {
console.log("a is clicked");
});
b.addEventListener("click", function () {
console.log("b is clicked");
});
c.addEventListener("click", function (event) {
console.log("c is clicked");
event.stopPropagation();
}); })();

结果为:

当点击c后,只有c被点击

stopPropagation()方法会阻止冒泡行为。

当代码再次修改为:

/**
* Created by Administrator on 2016/8/10.
*/
(function () { var a = document.getElementById("a");
var b = document.getElementById("b");
var c = document.getElementById("c"); a.addEventListener("click", function () {
console.log("a is clicked");
});
b.addEventListener("click", function () {
console.log("b is clicked");
});
c.addEventListener("click", function (event) {
console.log("c is clicked");
event.stopPropagation();
});
c.addEventListener("click",function () {
console.log("c1 is clicked");
});
})();

结果为:

当点击C的时候,两个事件都会触发。

在修改代码为:

/**
* Created by Administrator on 2016/8/10.
*/
(function () { var a = document.getElementById("a");
var b = document.getElementById("b");
var c = document.getElementById("c"); a.addEventListener("click", function () {
console.log("a is clicked");
});
b.addEventListener("click", function () {
console.log("b is clicked");
});
c.addEventListener("click", function (event) {
console.log("c is clicked");
event.stopPropagation();
event.stopImmediatePropagation();
});
c.addEventListener("click", function (event) {
console.log("c1 is clicked");
});
})();

结果为:

又变为只触发一个事件了。

stopImmediatePropagation()方法,只阻止父类,不阻止兄弟事件。(这里写错了,他也阻止了兄弟事件!!!!!!!!!!!!!!!!!!!!!!!!(剁手))

冒泡告一段落


开始讲三个阶段:

事件的三个阶段:捕获,目标,冒泡。

捕获阶段:从外到内,监听中设置为true,子类事件不产生

目标阶段:点击的目标

冒泡阶段:从内到外

先贴代码:

js

执行结果为:

执行顺序如图:先捕获,后目标,在冒泡。也可理解为,从外到内,在从内到外。

另外,可以用event.eventPhase去测试是什么阶段,

捕获阶段,返回值为1

目标阶段,返回值为2

冒泡阶段,返回值为3


自己的理解:

  用法,还没用到,以后补充(⊙﹏⊙)b;

  阻止冒泡的好处,防止子元素的父类元素被点击而触发子类事件。

  设置捕获的好处(设置,末尾true属性),可以是冒泡事件反向执行。


补充一点2016-10-28 11:08:55(感谢  "潘多拉之欣"  的提醒)

关于stopImmediatePropagation和stopPropagation的区别

网上大神的解释

myGitgub https://github.com/mfx55 希望我的博客能帮到你

js中事件三阶段的更多相关文章

  1. JS中事件绑定的三种方式

    以下是搜集的在JS中事件绑定的三种方式.   1. HTML onclick attribute     <button type="button" id="upl ...

  2. [js]js中事件的3要素

    js中事件的3要素 事件源 事件 事件处理程序 <!DOCTYPE html> <html> <head lang="en"> <meta ...

  3. 研究分析JS中的三种逻辑语句

    JS中的三种逻辑语句:顺序.分支和循环语句. 一.顺序语句 代码规范如下:1. <script type="text/javascript"> var a = 10;  ...

  4. js中的三种函数写法

    js中的三种函数写法 <script type="text/javascript"> //普通的声明方式 function myFun(m,n){ alert(m+n) ...

  5. JS中事件代理与委托

    在javasript中delegate这个词经常出现,看字面的意思,代理.委托.那么它究竟在什么样的情况下使用?它的原理又是什么?在各种框架中,也经常能看到delegate相关的接口.这些接口又有什么 ...

  6. JS中 事件冒泡与事件捕获

    [JS中的事件流]  1.事件冒泡:当某DOm元素触发一种事件时,会从当前节点开始,逐级往上触发其祖先节点的同类型事件,直到DOM根节点:   >>>什么情况下会产生事件冒泡 ① D ...

  7. 对于js中事件冒泡的理解分析

    一. 事件 事件的三个阶段:事件捕获 -> 事件目标 -> 事件冒泡 捕获阶段:先由文档的根节点document往事件触发对象,从外向内捕获事件对象: 目标阶段:到达目标事件位置(事发地) ...

  8. 对JS中事件委托的理解

    什么是事件委托: 事件委托——给父元素绑定事件,用来监听子元素的冒泡事件,并找到是哪个子元素的事件.(不理解冒泡的可以去百度下) 定义:利用事件冒泡处理动态元素事件绑定的方法,专业术语叫事件委托. 使 ...

  9. js中事件冒泡和事件捕获

    什么时候存在这种问题? 当一个行为触发了多个对象的事件时.   <body>   <div class="fa">     <div class=&q ...

随机推荐

  1. win10 ubuntu 同一硬盘双系统安装和启动设置

    1.了解启动的顺序 电脑开机--->  BIOS 设置 ----> 硬盘(MBR)/ GPT格式里的ESP分区 --->  (UEFI/GRUB)目录里的 *****.efi  -- ...

  2. CSU 1588 合并果子

    Description 现在有n堆果子,第i堆有ai个果子.现在要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数.求合并所有果子的最小代价. Input 第一行包含一个整数T(T<=5 ...

  3. struts2简单类型参数转换器(拦截器自动转换)

    这边测试类型int,string,date,list(set),map,下面贴代码 struts.xml文件代码 <!-- 类型转换 --> <action name="C ...

  4. How to generate a new dictionary file of mmseg

    How to generate a new dictionary file of mmseg 0.Usage about mmseg-node memtioned in github : var mm ...

  5. LeetCode - Max Area of Island

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  6. 黑马-Spring(IOC&DI) AOP

    IOC(控制翻转) 概念 把对象的创建.初始化.销毁等工作交给spring容器来做 案例 环境 步骤 1.  写一个HelloWorld类 2.  写一个配置文件   把hello类放到spring容 ...

  7. 每天进步一点点- 资源与URI(吐血精华总结)

    1.资源(Resources) 每一个URI代表一种资源这句话的理解 ***************************************************************** ...

  8. python-xlsxwriter模块绘制表格

    #coding: utf-8 import xlsxwriter workbook=xlsxwriter.Workbook('chart.xlsx') worksheet=workbook.add_w ...

  9. src-d engine 强大的git 历史分析工具

    src-d engine 包含了Babelfish ,同时可以看作是Babelfish 的升级版本,我们可以使用sql 进行代码分析 备注: 注意运行的时候需要容器支持 使用 安装docker   参 ...

  10. jquery 复选框(选中/取消)获取状态

    $("#login-rem").attr("checked","checked") //设置选中 $("#login-rem&qu ...