事件处理模式冒泡,事件捕获

1 篇文章 0 订阅

重点:
1、触发顺序:先捕获,再冒泡。
2、ie没有事件捕获
3、focus、blur、change、submit、reset、select等事件不冒泡
事件冒泡:结构上(非视觉上)嵌套关系的元素(自子元素冒泡向父元素)

    <style>
        .wrapper{
            width: 300px;
            height: 300px;
            background-color: red;
        }
        .content{
            /* margin-left: 300px; */
            width: 200px;
            height: 200px;
            background-color:green;
        }
        .box{
            /* margin-left: 200px; */
            width: 100px;
            height: 100px;
            background-color:orange;
        }
    </style>
</head>
<body>
    <!-- 事件冒泡:结构上(非视觉上)嵌套关系的元素(自子元素冒泡向父元素) -->
    <div class="wrapper">
        <div class="content">
            <div class="box"></div>
        </div>
    </div>
    <script>
        var wrapper = document.getElementsByClassName('wrapper')[0];
        var content = document.getElementsByClassName('content')[0];
        var box = document.getElementsByClassName('box')[0];

        wrapper.addEventListener('click',function(){
            console.log('wrapper');
        },false);
        content.addEventListener('click',function(){
            console.log('content');
        },false);
        box.addEventListener('click',function(){
            console.log('box');
        },false);
    </script>
</body>

事件捕获:(ie没有)最外层的先捕获。同一事件,自父元素捕获至子元素(自顶向下)

<body>
    <!-- 事件冒泡:结构上(非视觉上)嵌套关系的元素(自父元素捕获至子元素(自顶向下)) -->
    <div class="wrapper">
        <div class="content">
            <div class="box"></div>
        </div>
    </div>
    <script>
        var wrapper = document.getElementsByClassName('wrapper')[0];
        var content = document.getElementsByClassName('content')[0];
        var box = document.getElementsByClassName('box')[0];
        // boxBubble先绑定,先执行
        // wrapper content  box boxBubble contentBubble wrapperBubble
        wrapper.addEventListener('click',function(){
            console.log('wrapperBubble');
        },false);
        content.addEventListener('click',function(){
            console.log('contentBubble');
        },false);
        box.addEventListener('click',function(){
            console.log('boxBubble');
        },false);
        
        wrapper.addEventListener('click',function(){
            console.log('wrapper');
        },true);
        content.addEventListener('click',function(){
            console.log('content');
        },true);
        box.addEventListener('click',function(){
            console.log('box');
        },true);
    </script>
</body>

事件委托(用事件冒泡做的)

  <!-- 取消冒泡事件 -->
    <div class="wrapper">
    </div>
    <script>
        // 事件处理函数传的形参,是事件对象
        var wrapper = document.getElementsByClassName('wrapper')[0];
        document.onclick = function(){
            console.log('ppp');
        }
        wrapper.addEventListener('click',function(e){
            console.log('wrapper');
            //方法一: W3C标准方法,ie9不能用
            // e.stopPropagation();
            // 方法二:ie的方法(谷歌也可以)
            // e.cancelBubble = true;
            // 方法三:封装兼容的取消冒泡函数
            stopBubble(e);
        },false);
        function stopBubble(event){
            if(event.stopPropagation){
                event.stopPropagation();
            }else{
                event.cancelBubble = true;
            }
        }
     
    </script>

阻止默认事件

 <script>
        //默认事件:表单提交、a标签跳转,右键出菜单事件=== oncontextmenu
        // 只在句柄可用
        document.oncontextmenu = function(e){
            console.log('a');
            // 方法一:
            // return false;
            //  方法二:w3c标准,ie9不兼容
            // e.preventDefault();
            // 方法三:兼容ie
            // e.returnValue = false;
            return cancelHandle(e);
        }
        // 封装阻止默认事件的函数
        function cancelHandle(event){
            if(event.preventDefault){
                event.preventDefault();
            }else if(event.returnValue){
                event.returnValue = false;
            }else{
                 return false;
            }
        }
    </script>
<script>
        //默认事件:a标签跳转
        var a = document.getElementsByTagName('a')[0];
        a.onclick = function(e){
            cancelHandle(e);
        }
        // 封装阻止默认事件的函数
        function cancelHandle(event){
        //ie浏览器的event事件是window.event
        	var event = event||window.event;
            if(event.preventDefault){
                event.preventDefault();
            }else if(event.returnValue){
                event.returnValue = false;
            }else{
                 return false;
            }
        }
    </script>

事件委托:利用事件冒泡,和事件源对象进行处理

<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
        <li>9</li>
        <li>10</li>
    </ul>
    <!-- 事件委托:利用事件冒泡,和事件源对象进行处理 -->
    <!-- 优点:1、性能,不用循环所有元素一个个绑定事件 -->
    <!-- 2、灵活,当有新的子元素时不需要重新绑定事件 -->
    <script>
        var ul = document.getElementsByTagName('ul')[0];
        ul.onclick = function(event){
            var event = event||window.event;
            var target = event.srcElement||event.target;
            console.log(target.innerText);
        }
    </script>
</body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值