首页 > 其他分享 >事件委托和排他思想

事件委托和排他思想

时间:2022-11-08 10:35:28浏览次数:32  
标签:委托 思想 let 冒泡 按钮 btns 事件

一、事件委派

1.理解DOM事件流
  • 事件流描述的是从页面中接收事件的顺序。事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流。

  • DOM事件流分为三个阶段:

    • 捕获阶段:从上往下
    • 当前目标阶段
    • 冒泡阶段:从下往上
  • 事件流如下图所示:

  • 注意事项:

    • JavaScript代码中只能执行捕获或者冒泡其中的一个阶段。
    • addEventListener(type, listener[, useCapture])第三个参数如果是true,表示在事件捕获阶段调用事件处理程序;如果是false(不写默认就是false),表示在事件冒泡阶段调用事件处理程序。
    • 其中有些事件是没有冒泡的,比如onblur、onfocus、onmouseenter、onmouseleave。
2.掌握事件委托
  • 概念:事件委托也称为事件代理,在jQuery中称为事件委派。
  • 事件委托的作用:只操作了一次DOM,提高了程序的性能。
  • 事件委托的优点包括:可以大量节省内存占用,减少事件注册,比如在ul上代理所有li的click事件;实现动态绑定事件。
  • 事件委托的原理:不是每个子节点单独设置事件监听器,而是事件监听器设置在其父节点上,然后利用冒泡原理影响设置每个子节点。

二、排他思想

  • 应用:如果有同一组元素,我们想要某一个元素实现某种样式,需要用到循环的排他思想。

  • 排他思想原理:(1)先所有元素全部清除样式,即干掉其他人;(2)再给当前元素设置样式,即留下自己。

  • 场景一

    // 需求:点击哪个按钮,让当前按钮变为粉色,其余不变色
    <button>按钮1</button>
    <button>按钮2</button>
    <button>按钮3</button>
    <button>按钮4</button>
    <button>按钮5</button>
    <script>
    	// 获取所有按钮元素
        let btns = document.querySelectorAll('button')
    	for (let i = 0; i < btns.length; i++) {
            // 绑定点击事件
            btns[i].addaddEventListener('click', function () {
                for (let j = 0; j < btns.length; j++) {
                    // 干掉其他人
                    btns[j].style.backgroundColor = ''
                }
                // 留下自己
                this.style.backgroundColor = 'pink'
            })
        }
    </script>
    
  • 场景二

    // 需求:Tab栏切换时,只有选中项的背景颜色为粉色。默认第一项被选中其背景颜色为粉色,其余项无背景颜色。
    // 被选中的tab栏样式
    <style type="text/css">
    	.active {
            background-color: pink;
        }    
    <style>
    <ul>
        <li class="active">Tab1</li>
        <li>Tab2</li>
        <li>Tab3</li>
        <li>Tab4</li>
    </ul>
    <script>
    	// 获取所有的li标签元素
        let lis = document.querySelectorAll('li')
    	for (let i = 0; i < lis.length; i++) {
            // 绑定点击事件
            lis[i].addaddEventListener('click', function () {
                // 移除当前类
                document.querySelector('ul .active').classList.remove('active')
                // 为点击的添加类
                this.classList.add('active')
            })
        }
    </script>
    

标签:委托,思想,let,冒泡,按钮,btns,事件
From: https://www.cnblogs.com/P1Kaj1uu/p/16868788.html

相关文章

  • mapbox gl 相机飞行事件 flyTo
    map.flyTo({center:[camera.lon,camera.lat],//相机位置zoom:camera.zoom,//目标层级pitch:camera.pitch,//目标俯仰角......
  • contentEditable 富文本,中文输入法触发多次oninput事件解决办法
    1. contentEditable富文本,没有onchange事件,有oninput事件,但是遇见中文输入法时,会触发多次,而我们只想输入结束时触发。那我们需要用到compositionstart和compositionend事......
  • 事件10841解决oracle 9i中JDBC Thin Driver ORA-00600 [ttcgcshnd-1]的异常
    文档课题:事件10841解决oracle9i中JDBCThinDriverORA-00600ttcgcshnd-1的异常.用thindriver连接Oracle9i时,出现exception,如下所示java.sql.SQLException:ORA-00600:......
  • 事件上
    事件概述:事件是一个异步机制,从执行--观察--处理函数这个过程称之为事件组成事件名执行对象处理函数观察者示例<button>点击</button>varbtn=querySele......
  • JavaScript事件对象的详细分析
    <!DOCTYPEhtml><htmllang="en"><head>  <metacharset="UTF-8">  <metahttp-equiv="X-UA-Compatible"content="IE=edge">  <metaname="viewport"c......
  • 注册IRP_MJ_SHUTDOWN事件 基于ReactOS0303
      系统关闭时,会向注册SHUTDOWN事件的设备驱动发送IRP_MJ_SHUTDOWN事件。NTSTATUSSTDCALLNtShutdownSystem(INSHUTDOWN_ACTIONAction){if(Action>ShutdownPowe......
  • 浏览器事件循环
    执行js代码的时候,遇见同步任务,直接推入调用栈中执行,遇到异步任务,将该任务挂起,等到异步任务有返回之后推入到任务队列中,当调用栈中的所有同步任务全部执行完成,将任务队列中......
  • Eureka 注册、下线、续约事件的监听使用
    前言看图: 现在开发节奏如此紧张,大多数人为了跟得上敏捷的节奏,也就无形中丢掉了对技术整合的更多的拓展学习。那么,我选择小白文科普。不管这些东西是否简单还是复杂,只要存......
  • SpringBoot 事件发布监听机制使用、分析、注意点 (一篇到位)
    前言这一篇从应用角度来跟大伙讲讲这个spring事件监听机制,顺便涉及到那些我认为大家应该一块了解的,我也会展开说说。文章内容(包括不限于):1.对比观察者模式2.应用场景......
  • js事件双向绑定
    <inputid="input"type="text"/><spanid="span"></span><script>varinput=document.querySelector("#input);varspan=document.querySelector("#span......