JavaScript 事件委托

事件委托是一种事件处理方式,它可以通过在父元素上绑定事件,然后利用事件冒泡的特性,让父元素处理子元素上的事件。这样做的好处是可以减少事件监听器的数量,提高性能。

在 JavaScript 中,可以在父元素上添加事件监听器,并在事件处理函数中判断事件的触发元素是否是需要处理的子元素。可以通过 event.target 属性来获取触发事件的元素。

例如,我们可以在一个 ul 元素上绑定 click 事件,然后在事件处理函数中判断 event.target 是否是一个 li 元素,如果是,那么就可以进行相应的处理。

document.querySelector("ul").addEventListener("click", function(event) {
    if(event.target.tagName === "LI") {
        console.log("clicked on li element");
    }
});

这样做的好处是,可以减少为每个 li 元素添加事件监听器的工作量。当添加或删除 li 元素时,也不需要重新绑定或解绑事件监听器。

这种方法叫做事件委托,因为我们把事件的处理“委托”给了父元素来完成。 这样可以提高性能,减少事件监听器的数量,让代码更加简洁易读。

此外,事件委托还可以用于动态添加元素的场景。在使用事件委托时,我们只需要在父元素上绑定一次事件监听器,然后动态添加子元素时不需要再为新添加的子元素绑定事件监听器。

事件委托还可以用于解决冒泡事件导致的性能问题。当有大量的子元素都需要绑定同一个事件时,使用事件委托可以显著降低事件监听器的数量,从而提高性能。

另外,在使用 jQuery 类库进行事件委托时,可以使用 on() 方法来绑定事件,并使用事件委托的语法来规定事件处理的目标元素。例如, 下面的代码可以在 ul 元素上绑定单击事件,并规定只有 li 元素才会触发事件:

$("ul").on("click", "li", function(){
    console.log("clicked on li element");
});

使用 jQuery 类库进行事件委托可以使代码更加简洁易读,并且可以解决兼容性问题。

总之,事件委托是一种高效的事件处理方式,可以减少事件监听器的数量,提高性能,使代码更加简洁易读。在实际开发中,可以使用 JavaScript 原生方法或 jQuery 类库来实现事件委托。

作者:yuzhihui
出处:http://www.cnblogs.com/yuzhihui/ 声明:欢迎任何形式的转载,但请务必注明出处!!!
本文转载于网络 如有侵权请联系删除

相关文章

  • Envoy: modern Cloud Load Balancing 现代云负载均衡

    阅读前置要求:需要有CCNA或者等价的基础网络知识负载均衡我印象中负载均衡其实是个硬件设备。其实一开始确实是的,然而现在已经不同了。尤其是云厂商提供的负载均衡方案几乎全部是靠软件。现在的负载均衡不仅是网络流量复杂均衡,几乎所有的平衡多个计算资源负载的方案都可以叫做负载均衡。在云计算背景下,负载均衡其实有一个软件实体--proxy。准确说,他们其实是不一样的,但是不能否认他们的功能其实重叠,proxy将网络转发作为主要功能。并且在所有的servicemesh、cloud的资料中,这两个词指的就是同一个东西。现代云负载均衡现代云负载均衡一般会做些什么?基本上就是下面这三个servicediscover--targetpool--livenesshealthcheck--readinessloadbalancingL4/L7其实业界的负载均衡方案,就是这两类:四层负载均衡和七层负载均衡(L4&L7)。四层和七层指的是OSI7层模型下的四层、七层。第4层是传输层,第7层是应用层。要是之前不知道OSI模型那还好,要是以前仔细学过网络这个时候已经蒙了。四层还能负载均衡?那不是二层三层做的么

  • 速度起飞!精选10篇入门CV必读经典的baseline论文

    大家好,我叫Aaron!之前给大家整理过很多干货,今天再精选10篇CV图像分类任务的经典论文称为“baseline论文”——基石论文。快速准确吃透baseline论文,是学习CV其他细分任务论文的基石。精选整理10篇论文的篇目如下:NIPS-2012,Alexnet:深度学习CV领域划时代论文,具有里程碑意义《ImageNetClassificationwithDeepConvolutionalNeuralNetworks》ICLR-2015,VGGnet:开启3*3卷积堆叠时代《VeryDeepConvolutionalNetworksforLarge-ScaleImageRecognition》CVPR-2015,googlenet v1:Google系列论文开创论文,提出多尺度卷积模块《Goingdeeperwithconvolutions》arXiv-2015,googlenet v2:神经网络大杀器:BN层提出《BatchNormalization:AcceleratingDeepNetworkTrainingbyReducingInternalCovariateShift》

  • PXE+Kickstart实现批量化无人值守安装

    PXE+Kickstart工作概述1、网卡上的pxe芯片有512字节,存放了DHCP和TFTP的客户端。2、启动计算机选择网卡启动。3、pxe上的DHCP客户端会向DHCP服务器,申请IP4、DHCP服务器分配给它IP地址的同时通过以下字段,告诉pxe,TFTP的地址和它要下载的文件如:next-server xxx.xxx.xxx.xxxfilename"pxelinux.0"5、pxelinux.0告诉pxe要下载的配置文件是pxelinux.cfg目录下面的default6、pxe下载并依据配置文件的内容下载启动必须的文件,并通过ks.cfg开始系统安装。----------------------------------------cobbler功能使用一个以前定义的模板来配置DHCP服务(如果启用了管理DHCP)将一个存储库(yum或rsync)建立镜像或者解压缩一个媒介,以注册一个新操作系统在DHCP配置文件中为需要安装的机器创建一个条目,并使用你指定的参数(IP和Mac地址)在TFTP服务目录下创建适当的pxe文件重新启动DHCP服务以反映更改重新启动

  • QQ扫码快捷登陆

    借鉴了彩虹,云青大佬的代码研究了一下做出来了自己的QQ扫码登陆并接入到网站话不多说php代码//生成二维码 publicfunctiongetqrpic() { $url='https://ssl.ptlogin2.qq.com/ptqrshow?appid=1006102&e=2&l=M&s=4&d=72&v=4&t=0.5409099'.time().'daid=1&pt_3rd_aid=0'; $arr=$this->get_curl($url,0,0,0,1,0,0,1); preg_match('/qrsig=(.*?);/',$arr['header'],$match); if($qrsig=$match[1]){ exit('{"code":0,"qrsig":"'.$qrsig.'","data":"'

  • Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式

    查看字符编码:importchardet response=chardet.detect(b'\xe5\xbd\x93\xe5\x89\x8d\xe7\x9b\xae\xe5\xbd\x95\xe4\xb8\x8b\xe6\x89\x80\xe6\x9c\x89\xe6\x96\x87\xe4\xbb\xb6\xe5\x90\x8d\xe6\xb1\x87\xe6\x80\xbb\xe5\x88\x97\xe8\xa1\xa8') print(response) {'encoding':'utf-8','confidence':0.99,'language':''}复制乱码字符转换:response=b'\xe5\xbd\x93\xe5\x89\x8d\xe7\x9b\xae\xe5\xbd\x95\xe4\xb8\x8b\xe6\x89\x80\xe6\x9c\x89\xe6\x96\x87\xe4\xbb\xb6\xe5\x90\x8d\xe6\xb1

  • [Linux][mm]watermark_scale_factor的调整以及遇到的问题

    前言在较高的Linux版本上,支持了watermark_scale_factor参数(完整路径/proc/sys/vm/watermark_scale_factor)调整,这个数值可以比较有效的控制内存回收。在这里,描述一下使用的过程中,作者遇到过几个问题。分析min_free_kbytes过小的问题在分析watermark_scale_factor之前,我们先来看一下vm调整的另外一个参数min_free_kbytes。从代码的注释以及计算的过程我们可以知道,这个数值最小128,最大65536。在PC上也许还可用,但是在动辄256G甚至1T的服务器,最大64M这个数值显然是太小了,四舍五入约等于没有了。在大规格的服务器上,如果想要维持较高的可用内存,靠min_free_kbytes显然是不靠谱的。watermark_scale_factor的调整效果在内核的文档中,我们看下这个参数的描述: Thisfactorcontrolstheaggressivenessofkswapd.Itdefinestheamountofmemoryleftinanode/systembeforekswa

  • OPA error

    Sent:Monday,July4,20166:41PM本地eclipse复现错误的步骤如下: 修改cus.crm.lead项目的pom.xml的参数如下:1.10.0-SNAPSHOT->2.0.0-SNAPSHOT1.6.14->1.11.0 然后,maveninstall一下,runonserver. 访问:localhost:8080/cus.crm.lead/test-resources/testsuite.opa.html?responderOn=true 运行到第5个名为:ProductTest:AddProductTest测试用例的时候,会观察到这个“两次点击addbutton,第二次没有触发dialog”的错误。 本地run不起来,我看下这些错:Publishingfailedwithmultipleerrors Filenotfound:C:\Users\i042416\git\cus.crm.leads\target\m2e-wtp\web-resources\META-INF\MANIFEST.MF. Filenotfound:C:\Users\i0

  • gdb调试多线程 如何解死锁问题

    基础_多线程Q1gdb调试多线程如何解死锁问题?A1说明:排版不是很好可以直接查看原文链接gdb基本用法infothreads(showallthread) threadthreadnumber(switch) threadapplyallbreakdemo.cpp:42(all)eg: 同一个功能A,创建N个线程 同一个功能B,创建M个线程 来抢夺和释放资源C,D不清楚那个线程有限占用或者释放资源产生问题1跟踪那个线程ID代码实现顺序实际执行顺序是不一致的, 一般无法通过查看代码快速定位 threadIDid用那个呀?threadapplyallbreakdemo.cpp:19 threadapplyallbreakdemo.cpp:42pthread_mutex_tmymutex公共资源: 两个线程同时抢占 pmymutex显示了当前占用的线程(上图) 当前目前线程位于5882但是被 __owner=5883锁住*1Thread0x7ffff7fe1780(LWP5882。 2Thread0x7ffff6d6d700(LWP5883)threadID找到啦总结: pthread_m

  • CSS技巧收集——毛玻璃效果

    先上demo和源码 其实毛玻璃的模糊效果技术上比较简单,只是用到了css滤镜(filter)中的blur属性。但是要做一个好的毛玻璃效果,需要注意很多细节。 比如我们需要将上图中页面中间的文字区域变成毛玻璃效果,首先想到的是给其设置一个透明度,并添加模糊滤镜: .content{ background-color:rgba(0,0,0,0.3); -webkit-filter:blur(2px); -moz-filter:blur(2px); -ms-filter:blur(2px); -o-filter:blur(2px); filter:blur(2px); }复制 可是生成的效果却是下面这样: 从这个失败的例子我们得到两个结论: 1.对元素直接使用模糊会将其内容全部模糊掉,为了保证文字不会模糊掉需要多一个层单独应用模糊效果。 2.模糊效果并不会应用到其背后的元素上,所以需要使用content区域有和背景相同的背景图并进行模糊。 先解决第一个问题: 多一个层级的方法不通过添加元素,而通过伪元素。 .content{ z-index:1; } .content:after{

  • PHP避免大整数科学计数法

    php是没有bigint的,超过一定长度其实是当做float类型处理的。在表示的时候,会使用科学计数法。 演示code 在客户端执行: php-r"echo20123456789123456789;"复制 输出: 2.0123456789123E+19 那么怎么避免这种情况呢?用number_format(). php-r"echonumber_format(20123456789123456789,0,'.','');"复制 输出: 20123456789123457024 很明显最后2位不对。 如前面说的,int超过长度,已经益处,此时数据已经部分残缺了。没有解决办法。处理方式就是表创建该字段不应该用数字,而应该用字符串。 参考资料 手册-类型 PHP怎么将超长数值转换为字符串?  

  • Let's Encrypt,免费好用的 HTTPS 证书

    #参考https://imququ.com/post/letsencrypt-certificate.html#####argparse安装#http://www.cnblogs.com/emanlee/p/4577249.html 很早之前我就在关注 Let'sEncrypt 这个免费、自动化、开放的证书签发服务。它由ISRG(InternetSecurityResearchGroup,互联网安全研究小组)提供服务,而ISRG是来自于美国加利福尼亚州的一个公益组织。Let'sEncrypt得到了Mozilla、Cisco、Akamai、ElectronicFrontierFoundation和Chrome等众多公司和机构的支持,发展十分迅猛。 申请Let'sEncrypt证书不但免费,还非常简单,虽然每次只有90天的有效期,但可以通过脚本定期更新,配好之后一劳永逸。经过一段时间的观望,我也正式启用Let'sEncrypt证书了,本文记录本站申请过程和遇到的问题。 我没有使用Let'sEncrypt官网提供的工具来申请证书,而是用了 acme-tiny&n

  • 转:OSGi 入门篇:模块层

    OSGi入门篇:模块层 1什么是模块化 模块层是OSGi框架中最基础的一部分,其中Java的模块化特性在这一层得到了很好的实现。但是这种实现与Java本身现有的一些模块化特性又有明显的不同。本文介绍模块层的一些基础知识,以及OSGi联盟在设计模块层时所做的一些考虑。OSGi标准走到今天,并不是凭空想出来的,它的产生恰恰是为了弥补之前一些技术的缺陷。 模块化其实就是计算机科学中常见的一个概念:“将一个大型系统分解为多个较小的互相协作的逻辑单元,通过强制设定模块之间的逻辑边界来改善系统的维护性和封装性”。 在OSGi中模块的定义可以参考下图: 也就是说一个模块(module)定义了一个逻辑边界,这种模块本身精确的控制了哪些类是完全被封装起来的,而哪些类需要暴露出来作为外部使用。这样我们就可以轻松的将实现屏蔽在模块的内部,而将公共API暴露在外部。 2为什么需要模块化 2.1OSGi中模块化与面向对象的联系与区别 按照以上模块化的定义,可能有的人会问:“在面向对象里面,不是也有对模块化的支持吗?”没错,面向对象的概念可以说也在一定程度上支持模块化编程,那为什么还需要OSGi提供的模块化特性

  • 【深度学习系列】用Tensorflow实现经典CNN网络Vgg

      上周我们讲了经典CNN网络AlexNet对图像分类的效果,2014年,在AlexNet出来的两年后,牛津大学提出了Vgg网络,并在ILSVRC2014中的classification项目的比赛中取得了第2名的成绩(第一名是GoogLeNet,也是同年提出的)。在论文《VeryDeepConvolutionalNetworksforLarge-ScaleImageRecognition》中,作者提出通过缩小卷积核大小来构建更深的网络。   Vgg网络结构    VGGnet是Oxford的VisualGeometryGroup的team,在ILSVRC2014上的主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能,如下图,文章通过逐步增加网络深度来提高性能,虽然看起来有一点小暴力,没有特别多取巧的,但是确实有效,很多pretrained的方法就是使用VGG的model(主要是16和19),VGG相对其他的方法,参数空间很大,所以train一个vgg模型通常要花费更长的时间,不过公开的pretrainedmodel让我们很方便的使用,paper中的几

  • 算法入门基础——前缀数、最小字典序问题、切金条问题、会议室安排问题、项目收益问题、随机中位数问题

    packagecom.zuoshen.jichurumen.class07; importjava.util.Arrays; importjava.util.Comparator; importjava.util.PriorityQueue; /** *@authorShiZhe *@create2022-03-0823:14 */ publicclasscode01{ /** *前缀数节点结构 */ publicstaticclassTrieNode{ //通过次数 publicintpass; //作为结尾节点的次数 publicintend; //可能包涵的节点数组 publicTrieNode[]nexts; publicTrieNode(){ pass=0; end=0; //题目是26个字母的小写 nexts=newTrieNode[26]; } } /** *前缀树 */ publicstaticclassTrie{ //头结点 publicTrieNoderoot; //初始化 publicTrie(){ root=newTrieNode(); } //字符串

  • 专业实训题目需求分析

    3D推箱子 一.业务需求 1.问题 目前娱乐游戏越来越多,发展越来越快,3D视觉效果不高。 2.机会 抓住现代社会人们对日常娱乐的需求日益增大带来的机会,用3D效果吸引用户,增加玩游戏时的视觉感。 二.面向的用户类型 主要面向日常玩游戏会使用软件的用户。 三.用户需求 用户可以进入软件通过切换视角来对游戏中人物的位置进行定位,通过上下左右四个方向键的操作实现人物的行动,用户将每一个箱子都推到指定位置过关进行下一关。 四.软件需求 用两个手指滑动使得用户对于游戏中人物的位置等进行切换、观察,上下左右四个按钮键进行点击使得用户改变游戏人物行进的方向及控制行动,设定箱子数与箱子推到的地点数,当箱子推到指定位置时即可进入下一关。

  • 【BZOJ3727】Zadanie(PA2014 Final)-思维

    测试地址:Zadanie 题目大意:一棵树,第iii个点有aia_iai​个人,现在求出了bib_ibi​,为所有人走到点iii的总路程,要求还原aia_iai​。 做法:本题需要用到思维。 在我们求bib_ibi​的时候,我们可以使用换根法,那么我们能不能用换根法,找到a,ba,ba,b之间的关系呢? 在换根法中,先随便选一个点作为根(这个根不是指换根法中的根,而是为了算法方便而求出的根),把根从点iii换到父亲点jjj,bbb会增加sumi−(total−sumi)=2sumi−totalsum_i-(total-sum_i)=2sum_i-totalsumi​−(total−sumi​)=2sumi​−total,其中sumisum_isumi​为以iii为根的子树内所有点的aia_iai​之和,totaltotaltotal为所有点的aia_iai​之和。因此得到等式bj−bi=2sumi−totalb_j-b_i=2sum_i-totalbj​−bi​=2sumi​−total。 这样类推下去,我们可以得到n−1n-1n−1个等式。但之中有nnn个未知数,所以

  • 【RabbitMQ】3、工作队列模式(work模式)

      上一篇博客的作为rabbitMQ的入门程序,也是简单队列模式,一个生产者,一个消费者,今天这篇博客介绍work模式,一个生产者,多个消费者,下面的例子模拟两个消费者的情况。   图示:         一个生产者、两个消费者;一个消息只能被一个消费者获取。  在work模式中可以分为两种模式,一种是两个消费者平均消费队列中的消息,即使他们的消费能力是不一样的,这种似乎不太符合实际的情况。另一种是能者多劳模式,处理消息能力强的消费者会获取更多的消息,这种模式更符合实际需求。    生产者:向队列发送50条消息,下面代码中,生产者每生产一条消息后都会休眠一段时间,并且越往后休眠的时间越长。   publicclassSend{ privatefinalstaticStringQUEUE_NAME="test_queue_work"; publicstaticvoidmain(String[]argv)throwsException{ //获取到连

  • 清除yum缓存

    yumcleanall rm-rf/var/cache/yum/*

  • Reinstall My Mac - Problems and steps

    把光标移动的速度调到最快: SystemPreferences=>Keyboard=>KeyRepeatRate调到Fast SystemPreferences=>Keyboard=>DelayUntilRepeat调到Short 让Touchpad支持三个指头触摸可以Drag窗口: SystemPreferences=>Accessiblity=>Mouse&Touchpad=>Touchpadoption=>EnableDragging=>Threefingerdrag 设置中英文切换的快捷键: SystemPreferences=>Keyboard=>Shortcut=>InputSource=>(把两个都check起来,描述自己看) 把希捷的移动硬盘驱动装好(NTFS_for_MAC),不然时光机不能写入备份, 尽管时光机所使用的分区不是NTFS,但是我发现不装这个驱动,仍然不能写入。 最好是先把命令行代理配置好,不然有些东西下不到或者很慢: 命令行:touch~/.bash_profile

  • 如何发布一个Mac应用并使其成为全球付费榜第一

    Readdle公司如何发布第一个MacApp,并使之成为MacAppStore全球付费排名第一的 Easy注:自从发布了《程序员如何优雅的挣零花钱?》后,就不断有同学询问怎么做APP挣钱。这篇文章大概是我读过的关于Mac应用开发最详尽的了,所以这次GET翻译计划我们就翻了它,希望能对大家有所帮助。文章很长,特别要感谢下翻译的同学。 本文由@panblack翻译自Medium 把生命中的8个月在一篇博客里讲完,这可是相当难。不过我还是要大概讲一下Readdle公司如何创造我们第一个Macapp,并使之成为MacAppStore全球排名第一的付费应用的,以及这背后最有趣最重要的内情。  Readdle公司为iPhone和iPad开发非凡的生产力应用。我们通过8个应用(ScannerPro、Spark、Documents等)建立了一个可持续发展的业务,这些应用有4千5百万个用户,收获了数不尽的评论和奖项,甚至被预装在苹果零售店的演示机上。 这一切已经有近8年了,而现在我们终于发行了第一款Mac应用——PDFExpert,一个快速、健壮、美观的PDF编辑器。 在iOS领域打拼这么多年,为

  • 理解Docker(2):Docker 镜像

    理解Docker(2):Docker镜像 本系列文章将介绍Docker的有关知识: (1)Docker安装及基本用法 (2)Docker镜像 (3)Docker容器的隔离性-使用Linuxnamespace隔离容器的运行环境 (4)Docker容器的隔离性-使用cgroups限制容器使用的资源 (5)Docker网络    对于每个软件,除了它自身的代码以外,它的运行还需要有一个运行环境和依赖。不管这个软件是象往常一样运行在物理机或者虚机之中,还是运行在现在的容器之中,这些都是不变的。在传统环境中,软件在运行之前也需要经过代码开发->运行环境准备->安装软件->运行软件等环节,在容器环境中,中间的两个环节被镜像制作过程替代了。也就是说,镜像的制作也包括运行环境准备和安装软件等两个主要环节,以及一些其他环节。因此,Docker容器镜像其实并没有什么新的理论,只是这过程有了新的方式而已。   镜像(image)是动态的容器的静态表示(specification),包括容器所要运行的应用代码以及运行时的配置。Docker镜像包括一个

相关推荐

推荐阅读