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>

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");
    });

})();

js

运行结果如图:

当点击最小块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();
    });

})();

js

结果为:

当点击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");
    });
})();

js

结果为:

当点击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");
    });
})();

js

结果为:

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

stopImmediatePropagation()方法,只阻止父类,不阻止兄弟事件。

冒泡告一段落



开始讲三个阶段:

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

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

目标阶段:点击的目标

冒泡阶段:从内到外

先贴代码:

/**
 * 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("目标阶段的c is clicked");
    });
    b.addEventListener("click",function (event) {
        console.log("捕获阶段的b is clicked");
    },true);
    a.addEventListener("click",function () {
       console.log("捕获阶段的a is clicked");
    },true);
})();

js

执行结果为:

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

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

捕获阶段,返回值为1

目标阶段,返回值为2

冒泡阶段,返回值为3



自己的理解:

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

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

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

时间: 2024-09-30 15:49:45

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

JS中事件绑定的三种方式

以下是搜集的在JS中事件绑定的三种方式. 1. HTML onclick attribute <button type="button" id="upload" onclick="upload_file();"> 原文: http://www.w3school.com.cn/jsref/jsref_events.asp 2. jQuery .on() $(node).on("change", function(e)

笔记-[6]-js中事件绑定方法的总结

js中的两种对象事件绑定方法: 1:常用的如:div.onclick=function(){...}; 2:通过系统方法绑定事件: 非IE:addEventListener('事件名[不加on]',function(){},false[或者true]) IE:attachEvent('事件名[加on]',function(){}); 通过系统方法绑定事件可以让对象可以绑定相同的事件并且执行不同的操作,如果使用第一种方法绑定多个相同的事件,最后一个事件会覆盖前面所有的事件. 在addEventLi

JS中事件代理与委托

在javasript中delegate这个词经常出现,看字面的意思,代理.委托.那么它究竟在什么样的情况下使用?它的原理又是什么?在各种框架中,也经常能看到delegate相关的接口.这些接口又有什么特殊的用法呢?这篇文章就主要介绍一下javascript delegate的用法和原理,以及Dojo,jQuery等框架中delegate的接口. JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的

JS中事件冒泡(Bubble)和事件捕获(Capture)以及如何阻止事件的冒泡

对“捕获”和“冒泡”这两个概念,通常我们对冒泡了解和使用的会更多一些,因为在我们使用的所有浏览器中,都支持事件冒泡 ,即事件由子元素向祖先元素传播的,就 像气泡从水底向水面上浮一样.而在像firefox,chrome,safari这类所谓的标准浏览器中,事件传播通常是有三个阶段的:事件捕获阶段,事件目标阶段,事件冒泡阶段,这三者的执行的顺序是先捕获在冒泡.对于捕获阶段,这个很少 有用武之地,所以被人疏忽遗忘也在所难免了,不常用不代表它不存在,本着科学严谨的态度,我们有必要去看一下它的庐山真面目.

js 中事件的个人理解

事件 事件组成 1,触发谁的事件 事件源2,触发是什么事件 click mouseover mouseout3,事件触发之后,干什么 事件函数 (干什么写在事件函数中) 事件对象 类似于飞机的“黑匣子” 用于保存 一个事件发生的时候,所有的信息比如:事件发生时鼠标的坐标如何获取事件对象: 兼容性问题:在不同浏览器上 获取方法不一样 在IE 以及DOM标准:全局的对象(window下) 名字event 在高版本IE 以及 chrome 不支持event来获取事件对象的,另外一种方式 自动变成事件函

js中事件(自定义事件)

今天闲的蛋疼,我们来聊一聊web前端中的事件机制和自定义事件.灵感来自jQuery,在此感谢jQuery作者. 首先,最开始. <button id="button" type="button" onclick="alert('hello')">你好</button> 这是我们在使用html写页面的时候最原生的事件触发方式.上面那行代码会生成一个按钮,当我们点击这个按钮的时候就会弹出一个原生的弹窗,内容是hello. 随着

js中事件冒泡和事件捕获

什么时候存在这种问题? 当一个行为触发了多个对象的事件时. <body> <div class="fa"> <div class="son1"> <div class="son2"></div> </div> </div> <script type="text/javascript"> var fa = document.getEl

JS中事件的执行顺序和AJAX的异步

之前了解过异步和同步,知道同步是顺序执行,异步是同时执行,但是没有遇到过这种情况,不是很理解,这两天做项目突然遇到了,对这有了一个初步的认识.废话不多说,直接上要求. 1.项目要求:外部调用xml文件,然后JS动态生成下拉菜单,使多个文件同时使用此菜单,方便维护. 如图,下面白色为以前的菜单,但是多个地图都需要写同样的菜单比较麻烦,也不好修改,所以做一个xml文件,存储菜单内容,然后多个地图调用,容易修改,蓝色部分菜单. 2.项目代码:此处我使用的Jquery addMenu(){ $.ajax

JS中事件以及语句运行顺序的问题

先来看看问题: 问题:1.为何onfoucs事件在这段代码中是最后才执行的?2.这里有涉及到异步?不然的话为何onfocus事件还没执行,就继续解析下一段代码了?代码如图: 我在chrome,FF浏览器的运行结果得到的顺序都是:1.console.log(document.readyState)2.alert()语句3.最后才是onfocus方法 运行结果:1.一定是先出现loading的,否则alert会阻塞进程. 2.当我按下确定,则出现了下一段的test 这里面涉及到JS中的事件运行机制问