zoukankan      html  css  js  c++  java
  • stopImmediatePropagation的应用

    在众多的方法里面,event.stopImmediatePropagation 算是比较少用的一个方法,拼写上感觉一半像 event.stopPropagation。
    对于stopPropagation 的用法大家是众所周知的,他是W3C标准事件方法,用于阻止事件冒泡(非标准情况下,用window.event.stopBubble来阻止冒泡)
    而stopImmediatePropagation 的功能比stopPropagation 多一些,除了可以阻止事件冒泡之外,还可以把这个元素绑定的同类型事件也阻止了。

    先把下面的代码片断(摘自MDN)

    <!DOCTYPE html>
    <html>
        <head>
            <style>
                p { height: 30px; width: 150px; background-color: #ccf; }
                div {height: 30px; width: 150px; background-color: #cfc; }
            </style>
        </head>
        <body>
            <div>
                <p>paragraph</p>
            </div>
            <script>
                document.querySelector("p").addEventListener("click", function(event)
                {
                    alert("我是p元素上被绑定的第一个监听函数");
                }, false);
                document.querySelector("p").addEventListener("click", function(event)
                {
                    alert("我是p元素上被绑定的第二个监听函数");
                    event.stopImmediatePropagation();
                    //执行stopImmediatePropagation方法,阻止click事件冒泡,并且阻止p元素上绑定的其他click事件的事件监听函数的执行.
                }, false);
                document.querySelector("p").addEventListener("click", function(event)
                {
                    alert("我是p元素上被绑定的第三个监听函数");
                    //该监听函数排在上个函数后面,该函数不会被执行.
                }, false);
                document.querySelector("div").addEventListener("click", function(event)
                {
                    alert("我是div元素,我是p元素的上层元素");
                    //p元素的click事件没有向上冒泡,该函数不会被执行.
                }, false);
            </script>
        </body>
    </html>

    p标签绑定了三个click事件,div绑定了一个click事件。
    其中p第二个click事件中使用了event.stopImmediatePropagation();
    当点击时P标签时,第一和第二个alert会正常出现,
    第三个alert被event.stopImmediatePropagation();的特性取消了以后的同类型(click)事件
    第四个alert不出来同被阻止了事件冒泡,所以也不会出现。
    相当于做了event.stopPropagation()后,再return false;  jQuery对事件代理做了类似的封装。

    我们了解特性之后,看一个简单应用场景:

    假设点击一个按钮后,需要检测两个input控件的值,值为空时打印'error',并停止检测下一个input,同时也需停止提单提交。
    我们通常可能会这样写:

    <!DOCTYPE html>
    <html>
        <head>
        </head>
        <body>
    <form>
    <input type="text" id="txt1">
         <input type="text" id="txt2">
    <
    input type="submit" value="button" id="btn">
    </form>
    <script> var txt1 = document.querySelector("#txt1");
           var txt2 = document.querySelector("#txt2");
    var btn = document.querySelector("#btn"); btn.addEventListener("click", function(event) { if (txt1.value == '') { alert('error1');
    return false; }
              if (txt2.value == '') {
    alert(
    'error2');
    return false; }
    return true;
    },
    false); </script> </body> </html>

    但用了event.stopImmediatePropagation时,可以对代码进行更好的抽象。

    <!DOCTYPE html>
    <html>
        <head>
        </head>
        <body>
            <form>
            <input type="text" id="txt1">
         <input type="text" id="txt2">
            <input type="submit" value="button" id="btn">
            </form>
            <script>
                var txt1 = document.querySelector("#txt1");
          var txt2 = document.querySelector("#txt2");
                var btn = document.querySelector("#btn");
    
                btn.addEventListener("click", function(event) {
                    if (txt1.value == '') {
                        alert('error1');
                        event.stopImmediatePropagation();
                    }
            if (txt2.value == '') { 
                        alert('error2');
                        event.stopImmediatePropagation();
                    }
    
                    
                }, false);
          
                btn.addEventListener("click", function() {
                     alert('Done');
                });
            </script>
        </body>
    </html>

    题外:
    event.isImmediatePropagationStopped 可以用来确定该元素是否有调用过event.stopImmediatePropagation。

    浏览器支持情况:
    Firefox >=10Chrome
    IE >= 9
    Opera
    Safari

  • 相关阅读:
    hdu4578线段树维护平方和,立方和(加,乘,赋值)或者珂朵莉树
    珂朵莉树(ODT老司机树)
    Codeforces Round #524 (Div. 2)D
    HDU1402 FFT高精度乘法模板题
    中国剩余定理poj1006
    POJ
    Install and Config MySQL 8 on Ubuntu
    Protobuf Examples
    Learning Thrift
    Flask Quickstart
  • 原文地址:https://www.cnblogs.com/zzbo/p/3366264.html
Copyright © 2011-2022 走看看