• JavaScript事件:事件处理模型(冒泡、捕获)、取消冒泡、阻止默认事件


     

     


    (一)事件处理模型---事件冒泡、捕获

    (1)事件冒泡

    24 <body>
    25     <div class="warpper">
    26         <div class="content">
    27             <div class="box">
    28 
    29             </div>
    30         </div>
    31     </div>
    32 <script type="text/javascript">
    33     var warpper = document.getElementsByClassName('warpper')[0];
    34     var content = document.getElementsByClassName('content')[0];
    35     var box = document.getElementsByClassName('box')[0];
    36 
    37     warpper.addEventListener('click',function(){
    38         console.log("warpper-red");
    39     },false)
    40     content.addEventListener('click',function(){
    41         console.log('content-yellow');
    42     },false)
    43     box.addEventListener('click',function(){
    44         console.log('box-bule');
    45     },false)
    46 
    47 </script>
    48 
    49 </body>

     如下:点击蓝色区域,三个div都会相应click事件

     


     

     (2)事件捕获

    1     warpper.addEventListener('click',function(){
    2         console.log("warpper-red");
    3     },true)
    4     content.addEventListener('click',function(){
    5         console.log('content-yellow');
    6     },true)
    7     box.addEventListener('click',function(){
    8         console.log('box-bule');
    9     },true)

     点击蓝色区域,会先父级元素捕获到,然后在子元素;

     


     

    (3)触发顺序:先捕获 后冒泡

     1     warpper.addEventListener('click',function(){
     2         console.log("warpper-red,Bubble");
     3     },false)
     4     content.addEventListener('click',function(){
     5         console.log('content-yellow,Bubble');
     6     },false)
     7     box.addEventListener('click',function(){
     8         console.log('box-bule,Bubble');
     9     },false)
    10 
    11     warpper.addEventListener('click',function(){
    12         console.log("warpper-red");
    13     },true)
    14     content.addEventListener('click',function(){
    15         console.log('content-yellow');
    16     },true)
    17     box.addEventListener('click',function(){
    18         console.log('box-bule');
    19     },true)

     

     

     


     ***********************************************************************************************************************************************


     

    (二)阻止事件冒泡

    (1)取消冒泡

    先看示例:

     1 <body>
     2     <div style="100px;height:100px;background-color:red">
     3     </div>
     4 <script type="text/javascript">
     5     var div = document.getElementsByTagName('div')[0];
     6 
     7     document.onclick = function(){
     8         console.log('没事别点我-document');
     9     }
    10 
    11     div.onclick =function(){
    12         console.log("click-div");
    13     }
    14 </script>
    15 
    16 </body>

     

     

    由于我们在document上绑定了click事件,所以当我们点击红色的div时,由于冒泡问题,document的click事件也是会被触发;

     

    那如何来实现,当我们点击div时,只想让div相应对应的处理事件,而document不响应呢;

    那就是取消冒泡事件;

     

    (1)  方法1:  event.stopPropagation();   //IE9以下不支持

    说明:在事件处理函数可以设置一个形参,这个参数我们自己用不到,但是系统会传一个event过来;

     1 <script type="text/javascript">
     2     var div = document.getElementsByTagName('div')[0];
     3 
     4     document.onclick = function(){
     5         console.log('没事别点我-document');
     6     }
     7 
     8     div.onclick =function(event){
     9         event.stopPropagation();
    10         console.log("click-div");
    11     }
    12 </script>

     

    (2) 方法2:enent.cancelBubble();  //IE独有

     1 <script type="text/javascript">
     2     var div = document.getElementsByTagName('div')[0];
     3 
     4     document.onclick = function(){
     5         console.log('没事别点我-document');
     6     }
     7 
     8     div.onclick =function(event){
     9         event.cancelBubble = true;
    10         console.log("click-div");
    11     }
    12 </script>

     

     

    (3)针对取消冒泡的原生系统函数存在兼容性问题,我们自己来封装一个好的兼容性函数:

     1 <script type="text/javascript">
     2     var div = document.getElementsByTagName('div')[0];
     3 
     4     document.onclick = function(){
     5         console.log('没事别点我-document');
     6     }
     7 
     8     div.onclick =function(event){
     9         stopBubble(event);
    10         console.log("click-div");
    11     }
    12 
    13     function stopBubble(event){
    14         if(event.stopProgration){
    15             event.stopProgration();
    16         }else{
    17             event.cancelBubble = true;
    18         }
    19    }
    21 </script>

     

     

     


     ***********************************************************************************************************************************************


     (三)阻止默认事件

     

     

    以标签a为例,当点击a标签时,默认都是跳转的动作,这个就是默认事件;

    (1)  event.preventdefault()

     1 <body>
     2  <div>
     3      <a href="#">我是个a标签</a>
     4  </div>
     5 <script type="text/javascript">
     6     var div = document.getElementsByTagName('div')[0];
     7     var a = document.getElementsByTagName('a')[0];
     8 
     9     div.addEventListener('click',function(e){
    10         console.log('click-div');
    11     },false);
    12     a.addEventListener('click',function(e){
    13         // e.preventDefault();
    14         console.log('click-a');
    15     },false);
    16 </script>
    17 
    18 </body>

     

    1     a.addEventListener('click',function(e){
    2         e.preventDefault();
    3         console.log('click-a');
    4     },false);

     

    (2)   e.returnValue = false;

    1     a.addEventListener('click',function(e){
    2         // e.preventDefault();
    3         e.returnValue = false;
    4         console.log('click-a');
    5     },false);

    同样也是可以阻止默认事件,即点a跳转问题;

     

    (3)  兼容性问题。自己封装函数:

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

     

     (4) return false方法阻止默认事件:

    这个方法比较暴力,他会同事阻止事件冒泡也会阻止默认事件;写上此代码,连接不会被打开,事件也不会传递到上一层的父元素;可以理解为return false就等于同时调用了event.stopPropagation()和event.preventDefault();

     1 <script type="text/javascript">
     2     var div = document.getElementsByTagName('div')[0];
     3     var a = document.getElementsByTagName('a')[0];
     4 
     5     div.onclick = function(){
     6         console.log('click-div');
     7     }
     8 
     9     a.onclick = function(){
    10         console.log('click-1a');
    11     }
    12 </script>

     

    上述代码,点击a标签,实际干了三件事情,先后为 执行本身处理函数、冒泡父级处理函数,接着响应默认事件(跳转);

     1 <script type="text/javascript">
     2     var div = document.getElementsByTagName('div')[0];
     3     var a = document.getElementsByTagName('a')[0];
     4 
     5     div.onclick = function(){
     6         return false;
     7         console.log('click-div');
     8     }
     9 
    10     a.onclick = function(){
    11         console.log('click-1a');
    12     }
    13 </script>

    要想,既阻止默认事件又阻止冒泡事件,return false必须加在父级处理函数里面;


     

  • 相关阅读:
    sql 2008 r2
    js压缩反压缩
    .NET调用Java写的WebServices(可能会碰到的问题)
    ecshop
    Chrome插件
    Unity3d ShaderLab之WorldNormalVector
    Unity 3d中Shader是什么,可以吃吗?
    java,类的继承
    java,关于POJO,查阅资料
    java,编写一个汽车类
  • 原文地址:https://www.cnblogs.com/wood2012/p/8017195.html
Copyright © 2020-2023  润新知