• --《捡芝麻》--事件冒泡的处理方法及事件代理--


    时间冒泡机制

    在进行事件触发时或有事件冒泡的存在,会从底层不断往上冒泡进行事件触发。

    例如代码:

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<style type="text/css">
    			#box{
    				 100px;
    				height: 100px;
    				background-color: #333333;
    			}
    			#boxson{
    				 50px;
    				height: 50px;
    				background-color: #999;
    			}
    		</style>
    	</head>
    	<body>
    		<div id="box">
    			<div id="boxson">
    			</div>
    		</div>
    		<script src="test.js"></script>
    	</body>
    </html>
    
    
    //test.js
    var box = document.getElementById('box');
    var boxSon = document.getElementById('boxson');
    
    boxSon.addEventListener('click',function(){
    	console.log('clicked the boxson!')
    })
    
    box.addEventListener('click',function(){
    	console.log('clicked the box!')
    })
    

    当我们点击boxson时,在控制台仍可以看见box的事件也一并触发。这种自下而上的事件触发机制就是事件的冒泡触发。

    解决办法

    一、使用stopPropagation

    修改boxSon监听事件为:

    boxSon.addEventListener('click',function(e){
    	e.stopPropagation()
    	console.log('clicked the boxson!')
    })
    

    二、使用return false

    修改box监听事件为:

    box.addEventListener('click',function(e){
    	if(e.target == this){
    		console.log('clicked the box!')
    	}
    })
    

    判断e.target是否与触发的元素对象一致,一致才触发父元素的事件。

    在jQuery中,还有return false等方法,在vue中可以添加@click.prevent组织默认事件的方法阻止冒泡

    利用冒泡

    冒泡的机制已经熟悉,冒泡不只是会带来麻烦,也可以利用冒泡来实现监听事件的代理。

    事件代理,顾名思义,将原本元素标签的事件触发监听交由给其他元素进行代理。

    例如一个div中存在多个带有事件监听的子标签:

    <div id=‘obj1’>
    	<a href='#' click = 'func1()' id='a1'></a>
        <a href='#' click = 'func2()' id='a2'></a>
        <a href='#' click = 'func3()' id='a3'></a>
        <a href='#' click = 'func4()' id='a4'></a>
        <a href='#' click = 'func5()' id='a5'></a>
        ...
    </div>
    

    此时我们可以利用冒泡机制,在div中进行监听,从而进行统一处理

    obj1.addEventListener('click',function(e){
                var e=e||window.event;
                if(e.target.nodeName.toLowerCase()=='h5'){
                    alert(e.target.innerHTML);
                }
    
            },false);
    
    离大侠再近一步!
  • 相关阅读:
    C/C++ string.h头文件小结
    linux根据进程pid查看进程详细信息
    《mysql必知必会》读书笔记
    安装vim with python
    vim正则表达式小结
    C语言指针篇(二)多级指针
    C语言指针篇(一)指针与指针变量
    递归函数
    lan口和wan口的配置
    C语言基础篇(三) 指针
  • 原文地址:https://www.cnblogs.com/Samo-Li/p/13889657.html
Copyright © 2020-2023  润新知