zoukankan      html  css  js  c++  java
  • js中的preventDefault与stopPropagation详解

    1. preventDefault: 

      比如<a href="http://www.baidu.com">百度</a>,这是html中最基础的东西,起的作用就是点击百度链接到http://www.baidu.com,这是属于<a>标签的默认行为;preventDefault方法就是可以阻止它的默认行为的发生而发生其他的事情;

     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     5 <title>JS阻止链接跳转</title>
     6 <script type="text/javascript"> 
     7 function stopDefault( e ) { 
     8 if ( e && e.preventDefault ) 
     9    e.preventDefault(); 
    10     else 
    11    window.event.returnValue = false; 
    12 
    13     return false; 
    14 } 
    15 </script> 
    16 </head>
    17 <body>
    18 <a href="http://www.baidu.com" id="testLink">百度</a> 
    19 <script type="text/javascript"> 
    20 var test = document.getElementById('testLink'); 
    21 test.onclick = function(e) { 
    22    alert('我的链接地址是:' + this.href + ', 但是我不会跳转。'); 
    23    stopDefault(e); 
    24 } 
    25 </script>
    26 </body>
    27 </html>

    此时点击百度链接,不会打开http://www.baidu.com,而只是弹出一个alert对话框

    2. stopPropagation :

      起到阻止js事件冒泡的作用;

      2.1 讲stopPropagation方法之前必需先给大家讲解一下js的事件代理: 

      (1) 事件代理用到了两个在JavaSciprt事件中常被忽略的特性:事件冒泡以及目标元素

      事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发。这一过程被称为事件冒泡;这个事件从原始元素开始一直冒泡到DOM树的最上层.

      目标元素: 对任何一个事件来说,其目标元素都是原始元素,在我们的这个例子中也就是按钮。目标元素它在我们的事件对象中以属性的形式出现。使用事件代理的话我们可以把事件处理器添加到一个元素上,等待事件从它的子级元素里冒泡上来,并且可以很方便地判断出这个事件是从哪个元素开始的。

      下面看一段代码:

    <!DOCTYPE html>
    <HTML XMLns="http://www.w3.org/1999/xHTML" lang="gb2312">
    <head>
        <title> 阻止JS事件冒泡传递(cancelBubble 、stopPropagation)</title>
        <meta name="keywords" content="JS,事件冒泡,cancelBubble,stopPropagation" />
        <script>
            function doSomething (obj,evt) {
                alert(obj.id);
                var e=(evt)?evt:window.event;
                if (window.event) {
                    e.cancelBubble=true;// ie下阻止冒泡
                } else {
                    //e.preventDefault();
                    e.stopPropagation();// 其它浏览器下阻止冒泡
                }
            }
        </script>
    </head>
    <body>
        <div id="parent1" onclick="alert(this.id)" style="250px;background-color:yellow">
            <p>This is parent1 div.</p>
             <div id="child1" onclick="alert(this.id)" style="200px;background-color:orange">
                <p>This is child1.</p>
             </div>
            <p>This is parent1 div.</p>
        </div>
        <br />
        <div id="parent2" onclick="alert(this.id)" style="250px;background-color:cyan;">
             <p>This is parent2 div.</p>
             <div id="child2" onclick="doSomething(this,event);" style="200px;background-color:lightblue;">
                <p>This is child2. Will bubble.</p>
             </div>
             <p>This is parent2 div.</p>
        </div>
    </body>
    </HTML> 

    参考:http://www.jb51.net/article/46379.htm

      

  • 相关阅读:
    日期时间工具类
    jQuery 使用attr()方式设置 checked 失效原因及解决方法
    vue总结
    【笔记】golang中使用protocol buffers的底层库直接解码二进制数据
    【笔记】对golang的大量小对象的管理真的是无语了……
    【记录一个问题】thanos receiver在更换tsdb文件后,内存并未显著下降
    【笔记】论文阅读:《Gorilla: 一个快速, 可扩展的, 内存式时序数据库》
    【分享】thanos receiver的grafana报表配置
    【采坑小计】thanos receiver的官方文档中,并未说明tsdb落盘的配置方式
    【记录一个问题】thanos receiver在tsdb切换期间,导致remote write接口失败增加
  • 原文地址:https://www.cnblogs.com/max-tlp/p/8257688.html
Copyright © 2011-2022 走看看