zoukankan      html  css  js  c++  java
  • js事件再解析

    从别人空间摘得http://www.cnblogs.com/yexiaochai/p/3567597.html (强烈建议阅读本文前先看下这篇文章)

    这一个例子看懂了 就基本都搞清楚了

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <style type="text/css">
            #p {  300px; height: 300px; padding: 10px;  border: 1px solid black; }
            #c {  200px; height: 200px; border: 1px solid red; }
            #sub {  100px; height: 100px; border: 1px solid red; }
        </style>
    </head>
    <body>
    <div id="p">
        parent
        <div id="c">
            child
            <div id="sub">
                sub
    
            </div>
        </div>
    </div>
    <script type="text/javascript">
    
        window.alert = function (msg) {
            console.log(msg);
        };
    
        var p = document.getElementById('p'),
                c = document.getElementById('c'),
                sub = document.getElementById('sub');
    
        sub.addEventListener('click', function (e) {
            alert('sub节点冒泡');
    
        }, false);
    
        sub.addEventListener('click', function (e) {
            alert('sub节点捕获')
    
        }, true);
    
        p.addEventListener('click', function (e) {
            alert('父节点捕获11')
    
            //e.cancelBubble= true;
    
        }, true);
    
        p.addEventListener('click', function (e) {
            alert('父节点冒泡')
        }, false);
    
        c.addEventListener('click', function (e) {
            alert('子节点捕获');
    
        }, true);
    
        c.addEventListener('click', function (e) {
            alert('子节点冒泡');
            //e.stopPropagation();
        }, false);
    
        p.addEventListener('click', function (e) {
            alert('父节点捕获')
    
        }, true);
    
    </script>
    </body>
    </html>

    其中不管是捕获/处于/冒泡 那个阶段, 向组织事件进一步传播 统一用event.stopPropagation();

    ps:奇葩微软的e.cancleBubble= true 测试在ie9以上已经没用了,ie9以上也可以用event.stopPropagation();了

    ps2:e.cancleBubble 容易给人造成误解,以为它只是专门用来组织冒泡的!实际上它阻止的事事件三个阶段!!!!

    接下来又尝试 让所有事件都不捕获呢?

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <style type="text/css">
            #p {  300px; height: 300px; padding: 10px;  border: 1px solid black; }
            #c {  200px; height: 200px; border: 1px solid red; }
            #sub {  100px; height: 100px; border: 1px solid red; }
        </style>
    </head>
    <body>
    <div id="p">
        parent
        <div id="c">
            child
            <div id="sub">
                sub
    
            </div>
        </div>
    </div>
    <script type="text/javascript">
    
        window.alert = function (msg) {
            console.log(msg);
        };
    
        var p = document.getElementById('p'),
                c = document.getElementById('c'),
                sub = document.getElementById('sub');
    
        sub.addEventListener('click', function (e) {
            alert('sub节点冒泡');
    
        }, false);
    
        sub.addEventListener('click', function (e) {
            alert('sub节点捕获')
    
        }, false);
    
        p.addEventListener('click', function (e) {
            alert('父节点捕获11')
    
            //e.cancelBubble= true;
    
        }, false);
    
        p.addEventListener('click', function (e) {
            alert('父节点冒泡')
        }, false);
    
        c.addEventListener('click', function (e) {
            alert('子节点捕获');
    
        }, false);
    
        c.addEventListener('click', function (e) {
            alert('子节点冒泡');
            //e.stopPropagation();
        }, false);
    
        p.addEventListener('click', function (e) {
            alert('父节点捕获')
    
        }, false);
    
    </script>
    </body>
    </html>

    结果事:

    在一种情况:如果上面有一个遮罩呢?  三个嵌套的盒子会产生事件吗

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <style type="text/css">
            #p {  300px; height: 300px; padding: 10px;  border: 1px solid black; }
            #c {  200px; height: 200px; border: 1px solid red; }
            #sub {  100px; height: 100px; border: 1px solid red; }
            .float-left{
                position: absolute;
                left: 0;
                top: 0;
                 150px;
                height: 100px;
                padding: 10px;
                background-color: royalblue;
                border: 1px solid black;
                opacity:.5;
            }
        </style>
    </head>
    <body>
    <div id="p">
        parent
        <div id="c">
            child
            <div id="sub">
                sub
    
            </div>
        </div>
    </div>
    
    <div class="float-left">
        我会定位了哦~~~
    </div>
    <script type="text/javascript">
    
        window.alert = function (msg) {
            console.log(msg);
        };
    
        var p = document.getElementById('p'),
                c = document.getElementById('c'),
                sub = document.getElementById('sub');
    
        sub.addEventListener('click', function (e) {
            alert('sub节点冒泡');
    
        }, false);
    
        sub.addEventListener('click', function (e) {
            alert('sub节点捕获')
    
        }, false);
    
        p.addEventListener('click', function (e) {
            alert('父节点捕获11')
    
            //e.cancelBubble= true;
    
        }, false);
    
        p.addEventListener('click', function (e) {
            alert('父节点冒泡')
        }, false);
    
        c.addEventListener('click', function (e) {
            alert('子节点捕获');
    
        }, false);
    
        c.addEventListener('click', function (e) {
            alert('子节点冒泡');
            //e.stopPropagation();
        }, false);
    
        p.addEventListener('click', function (e) {
            alert('父节点捕获')
    
        }, false);
    
    </script>
    </body>
    </html>

     答案:点击在遮罩上则没有任何事件产生!!

    下面事遮罩上有事件的情况  三个嵌套的盒子会产生事件吗

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <style type="text/css">
            #p {  300px; height: 300px; padding: 10px;  border: 1px solid black; }
            #c {  200px; height: 200px; border: 1px solid red; }
            #sub {  100px; height: 100px; border: 1px solid red; }
            .float-left{
                position: absolute;
                left: 0;
                top: 0;
                 150px;
                height: 100px;
                padding: 10px;
                background-color: royalblue;
                border: 1px solid black;
                opacity:.5;
            }
        </style>
    </head>
    <body>
    <div id="p">
        parent
        <div id="c">
            child
            <div id="sub">
                sub
    
            </div>
        </div>
    </div>
    
    <div class="float-left">
        我会定位了哦~~~
    </div>
    <script type="text/javascript">
    
        window.alert = function (msg) {
            console.log(msg);
        };
    
        var p = document.getElementById('p'),
                c = document.getElementById('c'),
                sub = document.getElementById('sub');
    
        sub.addEventListener('click', function (e) {
            alert('sub节点冒泡');
    
        }, false);
    
        sub.addEventListener('click', function (e) {
            alert('sub节点捕获')
    
        }, false);
    
        p.addEventListener('click', function (e) {
            alert('父节点捕获11')
    
            //e.cancelBubble= true;
    
        }, false);
    
        p.addEventListener('click', function (e) {
            alert('父节点冒泡')
        }, false);
    
        c.addEventListener('click', function (e) {
            alert('子节点捕获');
    
        }, false);
    
        c.addEventListener('click', function (e) {
            alert('子节点冒泡');
            //e.stopPropagation();
        }, false);
    
        p.addEventListener('click', function (e) {
            alert('父节点捕获')
    
        }, false);
    
        var fleft= document.querySelector('.float-left');
        fleft.addEventListener('click', function (e) {
            alert('fleft捕获')
        }, true);
        fleft.addEventListener('click', function (e) {
            alert('fleft冒泡')
        }, false);
    
    </script>
    </body>
    </html>

    在点击时候发现:

    只有它自己的两个事件产生!!三个嵌套的盒子不会产生事件

    所以可以总结:事件的分阶段传播,是当有 盒子嵌套时候才会发生!!我们这个fleleft元素 内层没有元素,外层为body,所有不会影响那三个嵌套的盒子!

    别人的博客链接:http://www.cnblogs.com/yexiaochai/p/3567597.html

  • 相关阅读:
    .请写出常用的linux指令
    Maven常用命令有哪些
    Maven的工程类型有哪些
    eclipse中Build Path 导入的包和复制到 lib 包的区别
    马踏棋盘算法递归+回溯法实现 C语言
    微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能
    Android_保存用户名和密码码sharedPreference
    Android---XML序列化
    直接拿来用!最火的Android开源项目
    异步http开源框架使用(AsyncHttpClient)
  • 原文地址:https://www.cnblogs.com/WhiteHorseIsNotHorse/p/6295022.html
Copyright © 2011-2022 走看看