首页 > 其他分享 >JS事件冒泡与事件委派(委托)

JS事件冒泡与事件委派(委托)

时间:2022-10-19 20:48:44浏览次数:90  
标签:超链接 单击 JS 事件 响应函数 event 冒泡

学到了 学到了

看了这篇后博客后,对事件冒泡和事件委托有了清晰的理解 https://blog.csdn.net/weixin_48769418/article/details/115045810

 

一、事件冒泡

  • 指的是事件的向上传导,当后代元素上的事件被触发时,其祖先元素的相同事件也会被触发
  • 如果不希望发生事件冒泡可以通过事件对象属性来取消冒泡

举例:
效果图:
在这里插入图片描述
其中body是爷爷,绿色div(我是box1)是爸爸,黄色span(我是span)是儿子,给这三代都绑上单击响应函数
实现代码

body代码

<body>
    <div id="box1">
        我是box1
        <span id="s1">我是span</span>
    </div>
</body>

 

CSS代码

<style type="text/css">
    #box1{
        width: 200px;
        height: 200px;
        background-color: yellowgreen;
    }
    
    #s1{
        background-color: yellow;
    }
</style>

 

JS代码

<script type="text/javascript">
    
    window.onload = function(){
        
        //为s1绑定一个单击响应函数
        var s1 = document.getElementById("s1");
        s1.onclick=function(){
            alert("我是span单击响应函数");
        }
        
        //为box1绑定一个单击响应函数
        var box1 = document.getElementById("box1");
        box1.onclick=function(){
            alert("我是box1单击响应函数");
        }
        
        //body绑定一个单击响应函数
        document.body.onclick = function(){
            alert("我是body单击响应函数")
        }
    }
</script>

 

触发效果如下:
当点击儿子(span)时,他,他爸爸(div)及他爷爷(body)都会触发各自的响应函数,它爸爸同理

实现终止冒泡

  • 通过事件对象cancelBubble属性来取消冒泡
  • event.cancelBubble = true;
  • 如终止儿子(span)冒泡,即它爸爸及它爷爷都不触发单击事件

完整代码

s1.onclick=function(event){

    //解决浏览器兼容问题
    event=event || window.event;
    alert("我是span单击响应函数");
    
    //取消冒泡
    event.cancelBubble = true;
}

 

二、事件委派(委托)

是什么

  • 指将事件统一绑定给元素的共同的祖先元素
  • 当后代上的事件触发时,会一直冒泡到祖先元素
  • 通过祖先元素的响应函数来处理事件

下面举例子说明
效果图:
在这里插入图片描述
实现动态添加超链接并绑定事件

实现代码
body代码

<body>
        <button id="btn01">添加超链接</button>
        
        <ul id="u1" style="">
            <li ><a href="javascript:;" class="link">超链接一</a></li>
            <li ><a href="javascript:;" class="link">超链接二</a></li>
            <li ><a href="javascript:;" class="link">超链接三</a></li>
        </ul>
    </body>

 

 

JS代码

<script type="text/javascript">
    window.onload = function(){
        
        var u1= document.getElementById("u1");
        //点击按钮以后添加超链接
        var btn01 = document.getElementById("btn01");
        btn01.onclick=function(){
            
            //创建一个li
            var li = document.createElement("li");
            li.innerHTML="<a href='javascript:;' class='link'>新建超链接</a>";
            
            //将li添加到ul中
            u1.appendChild(li);
        }
        
        u1.onclick = function(event){
            //解决浏览器兼容问题
            event = event || window.event;
            
            /**
             * target
             *  -事件对象的target属性表示触发事件的对象
             *  -ul中包括li、文本及超链接,只有点击超链接触发事件
             */
            if(event.target.className == "link"){
                alert("我是ul单击响应函数");
            }
        }
    }
</script>

三、总结

事件冒泡是事件委托及事件传播的基础

标签:超链接,单击,JS,事件,响应函数,event,冒泡
From: https://www.cnblogs.com/haijiaozhu/p/16807652.html

相关文章

  • Javascript事件设计模式(七)
    一:事件设计概述事件机制可以使程序逻辑更加符合现实世界,在JavaScript中很多对象都有自己的事件,例如按钮就有onclick事件,下拉列表框就有onchange事件,通过这些事件可......
  • JQuery中的事件(三)
    一:页面载入ready(fn)当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。这是事件模块中最重要的一个函数,因为它可以极大地提高web应用程序的响应速度。简单地说,这个方法......
  • jsp与jsp之间的跳转----当有一个jsp在WEB-INF下
    不通过action来处理跳转,直接从test.jsp页面跳到WEB-INF下的test1.jsp。我们有时候会试试绝对路径的写法<%=request.getContext()=%>/WEB-INF/test1.jsp,但是还是不行。因为......
  • How to get the return value of the setTimeout inner function in js All In One
    HowtogetthereturnvalueofthesetTimeoutinnerfunctioninjsAllInOne在js中如何获取setTimeout内部函数的返回值✅Promisewrap&Async/Await......
  • 事件默认的参数,JS字符串拼接,HTML DOM 事件
    JS字符串拼接的几种方式 https://blog.csdn.net/u012320487/article/details/123822785传参数时保持默认的参数<inputtype="text"v-model="item.count"@change="u......
  • JSTL 判断<c:if test="true"></c:if>但是不执行的问题
    问题:JSTL判断<c:iftest="true"></c:if>但是不执行原因:JSTL语法的问题<c:iftest="${requestScope.page.pageNo>1} ">.......</c:if>在test中的}和"之......
  • Vue学习笔记之vue.js 两个等号 == 和三个等号===的区别
    /**==用于比较两者是否相等,忽略数据类型===用于更严谨的比较,值和值的数据类型都需要同时比较*/<!DOCTYPEhtml><htmllang="en"><head><metacharset="......
  • jQuery技术之事件处理
    1:事件流模型   如果单击一次在HTML页面上的某个按钮,不仅会触发按钮的单击事件,还将触发按钮所属容器(div、span)等的单击事件,同时还将触发父级容器的单击事件,直至body、......
  • JSTL标签库
    JSTL标签  1  分类  共有以下几种:核心标签库(c标签库)//常用,熟练运用xml标签库(x标签库)//操作xml,但是一般在dao层做,不用了解sql标签库(sql标......
  • [RxJS] mergeMap
    Mapsvaluestoanewobservableonemissionfromsource,subscribingtoandemittingresultsofinnerobservablesBydefaultmergeMapdoesnotlimitthenumbe......