js时间冒泡

【M M 问 我 怎 么 冒泡排序,你知道吗】| 附:分别使用JavaScript、PHP实现冒泡排序(时间复杂度) 代码 #include "stdio.h" #define N 100 main(){ int i,j,t; int a[5]={12,23,5,6,2}; printf("初始数据:\n"); for(int i=0;i<5;i++) printf("%d\n",a[i]); for(i=0;i<4;i++) for(int j=0;j<4-i;j++) if(a[j]>a[j+1]) { t=a[j]; a[j] 阅读详情
   在用jQuery的事件绑定时,会用到on()、bind()、live()、 delegate()这几个方法,但对他们的区别缺从未注意过,现稍总结一下,如有错误,欢迎指正。

      参考文档:
http://blog.youkuaiyun.com/xxd851116/article/details/8646899
http://www.jb51.net/article/57827.htm
http://www.jb51.net/article/67166.htm
http://api.jquery.com/on/
http://api.jquery.com/delegate/
http://api.jquery.com/bind/
http://api.jquery.com/live/
http://www.cnblogs.com/aaronjs/p/3481075.html
http://blog.jquery.com/2016/05/20/jquery-1-12-4-and-2-2-4-released/
http://blog.jquery.com/2016/06/09/jquery-3-0-final-released/

DOM树

      我们先种一颗DOM树,来说明接下来将要讲到的事件冒泡,图片引用自:
http://blog.youkuaiyun.com/xxd851116/article/details/8646899
这里写图片描述

在操纵DOM的语境中,document是根节点。

事件冒泡

      该小节内容均引自:
http://blog.youkuaiyun.com/xxd851116/article/details/8646899

当我们点击一个a链接时,其触发了链接元素的单击事件,该事件会引发所有已绑定到该元素的单击事件上的函数的执行——这就是事件触发

      如下代码,一个用户单击操作会触发alert函数的执行。

$('a').bind('click', function() { alert("That tickles!") });  
   
  • 1

      该事件触发过程用图片表示如下,图片引用自:
http://blog.youkuaiyun.com/xxd851116/article/details/8646899
这里写图片描述

而在上图执行之后,click事件会接着向树的根方向传播,广播到父元素,然后是每级的祖先元素,只要是它的某个后代元素上的单击事件被触发,事件就会传给它————这就是事件冒泡

      整个过程如下图所示,图片引用自:
http://blog.youkuaiyun.com/xxd851116/article/details/8646899
这里写图片描述

官方说明

      明白了事件冒泡的概念,我们正式进入jQuery的事件绑定与事件委托(也成事件代理)的讲解中。

      首先我们从jQuery的官网上看一下关于这4个方法的说明:

live():jQuery1.7之后弃用 (故本文不再讲解这个方法)
bind(): 动态添加的元素无法使用该方法绑定事件
delegate():jQuery1.7之后被on()取代
on(): jQuery1.7之后引入,支持事件绑定的全部功能。

      此外,jQuery官网上还说明的一点是:

In Internet Explorer 8 and lower, a few events such as change and submit do not natively bubble but jQuery patches these to bubble and create consistent cross-browser behavior.(引用自:
http://api.jquery.com/on/ ‘Direct and delegated events’)

      翻译过来就是:

在IE8和之前的版本中,少数事件如change、submit不支持原生的事件冒泡,但是jQuery为它们模拟了事件冒泡以此创建了一致的、跨浏览器的行为。

      换句话说:jQuery模拟了所有的事件冒泡,使所有事件到支持事件冒泡并兼容所有浏览器。

bind

bind()的用法

      bind()的用法如下:

//绑定单个事件
$( "#foo" ).bind( "click", function() {
  alert( "User clicked on 'foo.'" );
});
//绑定多个事件
$( "#foo" ).bind( "mouseenter mouseleave", function() {
  $( this ).toggleClass( "entered" );
});
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

bind()存在的问题

      我们用一个能够看出bind()问题的代码来说明

$("div").bind("click", function () {
     alert($(this).text());
 })
   
  • 1
  • 2
  • 3

      这段代码的作用是:扫描整个html文档找出所有的$(‘div’)元素,并把alert函数绑定到每个元素的click事件上。

      从这个代码中,我们可以发现bind()有如下问题:

    1、这里用到了隐式迭代,如果匹配到的元素特别多的时候,比如页面中有100个div元素,就得执行绑定100次。对于大量元素来说,影响到了性能。但是如果是id选择器,因为id唯一,用bind()方法就很快捷了。
    2、bind()只能给调用它的时候已经存在的元素绑定事件,对于动态添加的元素无法使用该方法绑定事件。
    3、官网建议使用on()来替代bind()

delegate

      上述bind()的前2个问题,用delegate可以解决。

delegate()的用法

      delegate()的用法如下:

$('#container').delegate('a', 'click', function() { alert("That tickles!") }); 
   
  • 1

      这段代码的作用是:扫描文档查找$(‘#container’)</code>,并使用click事件和’a’这一CSS选择器作为参数把alert函数绑定到<code>$(‘#container’)上。任何时候只要有事件冒泡到$(‘#container’)上,它就查看该事件是否是click事件,以及该事件的目标元素是否与CCS选择器(即’a’元素)相匹配。如果两种检查的结果都为真的话,它就执行函数。

delegate()的特点

    1、直接将目标元素选择符("a")、事件("click")及处理程序与“委托方”$("#container")绑定,不额外收集元素、事件传播路径缩短、语义明确;
    2、支持链式调用,即支持如$("table").find("#info").delegate(...)的代码来精确控制;
    3、使用事件委托时,如果注册到目标元素上的其他事件处理程序使用.stopPropagation()阻止了事件传播,那么事件委托就会失效。

使用delegate()而不是bind()的原因

1、为了把处理程序附加到可能还未存在于DOM中的DOM元素之上。因为bind是直接把处理程序绑定到各个元素上,它不能把处理程序绑定到还未存在于页面中的元素之上。

2、如果你运行了$(‘a’).bind(…),而后新的链接经由AJAX加入到了页面中,则你的bind处理程序对于这些新加入的链接来说是无效的。而另一方面delegate则是被绑定到另一个祖先节点上,因此其对于任何目前或是将来存在于该祖先元素之内的元素都是有效的。

3、或者为了把处理程序附加到单个元素上或是一小组元素之上,监听后代元素上的事件而不是循环遍历并把同一个函数逐个附加到DOM中的100个元素上。把处理程序附加到一个(或是一小组)祖先元素上而不是直接把处理程序附加到页面中的所有元素上,这种做法带来了性能上的好处。

(引用自:http://blog.youkuaiyun.com/xxd851116/article/details/8646899)

on

      通过查看jQuery的源代码(我查看的版本是1.12.4),可以发现无论bind()还是delegate()都是通过on()方法实现的,只是参数不同,如下图:
这里写图片描述

      on()的官方API描述如下:

.on( events [, selector ] [, data ][, handler])
   
  • 1

官网建议从jQuery1.7开始,尽量使用on()方法来绑定事件,可以不必再使用delegate()或bind()方法了。

直接绑定和事件委托

      我们直接看官网对直接绑定和事件委托的介绍

      大多数浏览器的事件冒泡,都是从文档的最深、最内层发生事件的元素(也称为event target——事件目标),一路向上到达body或document元素上。在IE8和之前的版本上,少数事件例如change、submit不支持原生的事件冒泡,但jQuery模拟并创建了一致的、跨浏览器的事件冒泡行为。

      

      如果on()方法的selector 参数为空,事件处理程序就被称为直接绑定。每当在被绑定元素上(如下例中被绑定的document元素,译者注)发生事件时,无论这个事件发生在这个元素上还是从内层元素经冒泡而来,该处理程序都会被调用。

      并且,如果on()方法的selector 参数为空,它与bind()方法相同——只能绑定页面已有元素的事件。

      下面我们用代码说明什么是直接绑定:

<body>
<div>
        这是一个div
        <button>点击</button>
</div>
<script type="text/javascript">
        $(function(){
            //将click事件绑定在document对象上,
            //页面上任何元素发生的click事件都冒泡到document对象上得到处理
            //从而调用事件处理程序
            //本例为了简单绑定到了document,实际上绑定到那个元素上都有类似效果
            $(document).on("click",function(e){
               console.log(e.target.tagName + " is clicked")
            })  
        })
    </script>
</body>
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

      页面执行效果如下图:
这里写图片描述

      如果on()方法的selector 参数不为空,事件处理程序就被称为委托。当事件直接发生在被绑定的元素上(如下例中绑定到document上,译者注)时,该程序不会被调用,而只有当事件发生在与选择器匹配的内部元素上(如下例中click事件发生在button上,译者注)时,才会调用该程序。

      

jQuery的事件委托是将事件从事件的发生者(即event target,译者注)一直向上冒泡到绑定了事件处理程序的元素上(例如从最内层元素向上冒泡到最外层元素),并为冒泡“沿路”过程中匹配的所有选择器执行事件处理程序。

      下面我们用代码说明什么是委托:

<body>
    <div>
        这是一个div
        <button>点击</button>
    </div>
    <script type="text/javascript">
        $(function(){
            //将click事件绑定在document对象上,
            //并传入第二个可选参数:selector
            //当事件冒泡到document对象时,检测事件的target,
            //如果与传入的选择符(这里是button)匹配,就调用事件处理程序即触发事件,否则不触发。
            $(document).on("click","button",function(e){
                console.log(e.target.tagName + " is clicked")
            })
        })
    </script>
    </body>
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

      面执行效果如下图:
这里写图片描述

事件处理程序只会被绑定到当前已被选定的元素上(如上例中的document元素上,译者注),这些元素在调用on()方法时必须已经存在——同bind()。

为了确保这些元素已经存在并能被选中,请将代码放置到</body>标签之前或者在$(function(){ ... })内执行事件绑定。或者,使用事件委托来绑定事件处理程序。

      

事件委托的优点
      1、能处理来自于内层子元素的事件,这些内层子元素是在稍后时间里被添加的文档中的。通过选择一个在绑定事件委托处理程序时肯定存在的元素,就可以使用事件委托来避免 需要频繁的添加和删除事件处理程序的操作。
      这个元素可以是MVC模式下的一个视图容器元素或者是document元素(如果事件处理程序需要监听文档中的全部冒泡事件)。在加载任何html代码之前,document元素已经在html文档的头部存在了,所以无需等待dom ready就可以在document这个元素上绑定事件了,这是安全可靠的。

      2、除了可以处理尚未创建的内层子元素的事件,事件委托的另一个优点是:当需要监听很多元素时,事件委托的性能更好。

例如:有一个1000行数据的表格,下面的代码就是将一个事件处理程序绑定到这1000个元素上,事件绑定需要执行1000次。

$( "#dataTable tbody tr" ).on( "click", function() {
  console.log( $( this ).text() );
});
   
  • 1
  • 2
  • 3

      事件委托方式(如下代码)是将事件处理程序绑定到一个元素上,即tbody上,事件只需向上冒泡一级(从被点击的tr元素到tbody元素)。事件只需绑定一次,然后采用事件冒泡来触发事件。

$( "#dataTable tbody" ).on( "click", "tr", function() {
  console.log( $( this ).text() );
});
   
  • 1
  • 2
  • 3

以上内容翻译自:http://api.jquery.com/on/ 《Direct and delegated events》一节

总结

1.选择器匹配到的元素比较多时,不要用bind()迭代绑定
2.用id选择器时,可以用bind()
3.需要给动态添加的元素绑定时,用delegate()或者on()
4.用delegate()和on()方法,dom树不要太深
5.尽量使用on()来代替delegate()和bind()
6.在需要为较多的元素绑定事件的时候,优先考虑事件委托,可以带来性能上的好处
7.bind()和delegate()都是通过on()方法实现的,只是参数不同——当on()的selector参数为空时,其效果完全等同于bind();当selector参数不为空时,其效果完全等同于delegate();
8.使用.on()方法时,事件只会绑定到$()函数的选择符表达式匹配的元素上(上面例子中,为了简单绑定到了document),因此可以精确地定位到页面中的一部分,从而减少事件冒泡的开销。

附 关于各版本对浏览器的兼容

引用jQuery官网的原话说明一下各版本对浏览器的兼容问题

1.x 版本支持 IE 6/7/8, 2.x 版本不支持 IE 6/7/8

1.12.4下载地址:
https://code.jquery.com/jquery-1.12.4.js
https://code.jquery.com/jquery-1.12.4.min.js

2.2.4下载地址:
https://code.jquery.com/jquery-2.2.4.js
https://code.jquery.com/jquery-2.2.4.min.js

(引用自:http://blog.jquery.com/2016/05/20/jquery-1-12-4-and-2-2-4-released/ )

1.12和2.2版本仍会提供重要补丁,但不会新增功能或做重大修改。3.x版本将是jQuery未来的主流版本,如果仍想在IE6-8上使用jQuery,请使用1.12的最新版本

(引用自:http://blog.jquery.com/2016/06/09/jquery-3-0-final-released/)

(function () {('pre.prettyprint code').each(function () { var lines = (this).text().split(′\n′).length;var numbering = $('
  • ').addClass('pre-numbering').hide(); (this).addClass(′has−numbering′).parent().append( numbering); for (i = 1; i
Proteus仿真实战:ADC0832时序解析与51单片机精准电压采集 本文详细解析了ADC0832模数转换芯片在Proteus仿真环境中的时序控制与51单片机驱动实现。通过实战代码示例和精度优化技巧,帮助开发者掌握电压采集的关键技术,包括时序配置、数据校验和噪声抑制等核心要点,提升嵌入式系统设计的精准度与可靠性。 阅读详情

相关推荐

RK3588内核崩溃日志捕获:pstore与ramoops的实战配置指南

本文详细介绍了在RK3588嵌入式设备上配置pstore与ramoops以捕获内核崩溃日志的实战指南。通过内核配置调整、设备树设置及高级调试技巧,帮助开发者有效定位系统崩溃原因,特别适合户外智能设备等无法长期连接调试器的场景。文章还提供了生产环境优化建议,确保日志捕获的可靠性与安全性。

weixin_29189363的博客 407

jQuery事件委托

又名事件代理,利用事件的冒泡机制,以及事件对象中可以准确获知触发事件元素的属性,将多个使用相同事件进行类似操作的子元素的事件处理函数委托给父元素绑定的现象。减少重复性绑定的事件处理函数,减少内存占用新添加的子元素也能拥有事件。

m0_67388537的博客 840

2026年数据中心运行与管理专业人才培养基地建设方案(高职、数据中心运行与管理新专业、人才培养、专业代码:510310)

摘要: 为响应国家“东数西算”战略和数字经济需求,我校拟联合行业领军企业建设数据中心运行与管理人才培养基地。项目基于国家政策引导和产业快速发展背景,针对行业10万人才缺口,对标教育部新设专业标准(510310),分三阶段实施五年规划:专业奠基(2026-2028)、内涵深化(2028-2029)、辐射引领(2030-2031)。建设内容涵盖校企协同岗位能力分析、模块化课程开发(如网络管理、自动化运维等)、实训基地搭建及“课证融通”培养模式,重点培养基础设施、网络服务、运维托管三类岗位技能人才,目标建成区域性

啊碧根果的博客 1685

Jquery 事件委托(代理)

Jquery 事件委托(代理)

sinat_39670720的博客 626

Cursor 团队代码规范与开发规则

本文提出了一套 Cursor 项目开发规范,涵盖代码结构、命名、日志、测试等关键环节,旨在提升代码质量和团队协作效率。核心规则包括:文件不超过2000行、函数不超过80行;变量命名禁用无意义单词;日志只记录关键信息;配置项禁止硬编码;依赖和敏感信息统一管理;核心逻辑测试覆盖率≥80%;Git提交遵循Conventional Commits规范。通过一个车辆数据处理函数的改造案例,展示了从"不规范"到"规范"的代码优化过程,体现了拆分函数、常量管理、错误处理等规范的实际

1255

无人机避障——4DMmvRadar三维点云坐标转换到无人机坐标系(三)

无人机避障——4DMmvRadar三维点云坐标转换到无人机坐标系(三)

weixin_45390670的博客 1869

【Javascript】【jQuery】jQuery事件代理

事件代理:子元素的监听事件委托给父容器处理,事件的监听回调加在父容器上面,但是event.target却指向子元素 事件代理应用场景:当子元素众多,或者会动态增加时,可以一次性给所有子元素,包括新增子元素,都添加事件 //添加事件代理 $(’#parent’).delegate(’.child’,‘click’,function(){ this.style.background = ‘red’ }...

天天向上 Up Up Up (*^▽^*) 679

避开地图定位的坑:手把手教你处理GCJ-02和WGS-84坐标转换(2023最新版)

本文深入解析了GCJ-02与WGS-84坐标系转换的核心原理与常见误区,提供了详细的代码实现与精度控制方法。针对地图定位开发中的实际痛点,文章重点阐述了如何通过迭代逼近法实现高精度坐标转换,并给出了误差测试与业务场景下的工程实践指南,帮助开发者有效规避定位漂移等问题。

lstm7chronicler的博客 1169

JQuery 事件&事件代理

JQuery 事件jQuery事件1. 常用事件2. 笔记 jQuery事件 学 习目标 能够说出两个常用的jQuery事件 1. 常用事件 click() 鼠标单击 blur() 元素失去焦点 focus() 元素获得焦点 mouseover() 鼠标进入(进入子元素也触发) mouseout() 鼠标离开(离开子元素也触发) ready() DOM加载完成 示例代码: <!DOCTYPE html> <html lang="en"> <head> &

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 1232

六、数据资产平台功能架构

该架构图展示了一个功能完善的数据资产平台,它涵盖了数据资产管理的各个方面,从数据采集、模型设计、编目到使用和分析。通过该平台,企业可以更好地管理数据资产,提高数据利用效率,并为业务决策提供有力支持。

moton2017的博客 1626

【MATLAB例程】基于TDOA定位(两步最小二乘)的三维轨迹定位和UKF滤波,TDOA的锚点可以自适应,附完整代码

该代码实现了一种**融合TDOA(到达时间差)定位与无迹卡尔曼滤波(UKF)**的动态目标轨迹跟踪方案,适用于三维空间中的移动目标定位与滤波。TDOA定位:通过两步加权最小二乘法(TS-WLS)解算目标位置。UKF滤波:对定位结果进行非线性滤波,抑制噪声并提升轨迹平滑性。多维度误差分析:对比滤波前后误差,评估算法性能。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 675

jQuery的事件绑定与事件委托

在用jQuery的事件绑定时,会用到on()、bind()、live()、 delegate()这几个方法,但对他们的区别缺从未注意过,现稍总结一下,如有错误,欢迎指正。       参考文档: http://blog.youkuaiyun.com/xxd851116/article/details/8646899 http://www.jb51.net/article/57827.htm http://

aiolos1111的专栏 1万+

SpringBoot 整合Jasypt 实现配置文件加密读取操作详解

SpringBoot 整合Jasypt 实现配置文件加密读取操作详解

congge 4099

js阻止时间冒泡

weixin_42488377的博客 434

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

js实现冒泡排序,快速排序,堆排序【解析时间空间复杂度】

冒泡排序(Bubble Sort) 冒泡排序它在所有排序算法中最简单。然而, 从运行时间的角度来看,冒泡排序是最差的一个,它的复杂度是O(n2)。 冒泡排序比较任何两个相邻的项,如果第一个比第二个大,则交换它们。元素项向上移动至正确的顺序,就好像气泡升至表面一样,冒泡排序因此得名。 交换时,我们用一个中间值来存储某一交换项的值。其他排序法也会用到这个方法,因此我 们声明一个方法放置这段交换代码以...

敲敲的博客 1885

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

javascript时间冒泡和事件捕获

事件冒泡,事件按从指定对象触发到document对象的顺序触发。 事件捕获,事件按从document对象到指定目标对象的顺序触发。 阻止事件冒泡,函数传入event参数,函数体中使用e.stopPropagation();阻止事件向上冒泡。 this,e.target和e.currentTarget区别 js事件是会向上冒泡的,所以this是可以变化的,但e.target不会向上冒

qq_33418050的博客 732

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

轻松理解JS时间冒泡机制

首先我们先来回顾JS有哪些事件: 1、鼠标事件:onclick、ondbclick、onmousedown、onmouseup、onmouseover、onmousemove、onmouseout…; 2、页面事件:onload、onunload、onresize、onerror、onabort; 3、键盘事件:onkeypress、onkeydown、onkeyup; 4、表单事件:onblur...

weixin_43905830的博客 918

js时间冒泡,阻止事件冒泡

首先解释一下事件冒泡神什么, 在js中,假如在div中嵌套一个div 如 <style type="text/css"> #box1{width:500px;height:500px;background:#900;} #box2{width:400px;height:400px;background:#090;} #box3{w...

weixin_30875157的博客 112

js:事件冒泡和时间捕获详解

记得刚学js的时候,对于事件冒泡和事件捕获总是一知半解,不知道能干嘛,有啥意义,就知道冒泡就是从你子节点一级一级向上触发。。。然而并不知道起本质和机制,应用等!今天小飞飞就带小伙伴们从新认识下这些究竟什么东西! 了解这些之前你必须知道这几个东西,什么event事件对象?,什么是事件流? 1.事件流:就是事件执行顺序.分为冒泡和捕获 冒泡:假如有一个div中包含一个p标签

小飞飞的博客 5293

js中阻止时间冒泡的方法

js阻止事件冒泡的DEMO //阻止冒泡的方法 function stopPP(e) { var evt = e || window.event; //IE用cancelBubble=true来阻止而FF下需要用stopPropagation方法 evt.stopPropagatio

PAOPAO0327的专栏 1069

js时间-价格-排序案例____冒泡排序实例

js 时间-价格-排序,静态页面排序案例 冒泡排序实例 在项目中用到的一个例子,分享一下。 var sort = { sortdata : '', //排序之前必须先填充原始数据 //来源我的博客:http://yijianfengvip.blog.163.com/blog/static/1752734322011102145823/ flag...

weixin_33730836的博客 88

javascript 阻止时间冒泡

//如果提供了事件对象,则这是一个非IE浏览器 if(evt.stopPropagation) { evt.stopPropagation(); } //否则,我们需要使用IE的方式来取消事件冒泡 evt.cancelBubble = true;

linminqin的专栏 1195
上一篇: 关于js重复绑定
下一篇: java.sql.BatchUpdateException: Incorrect string value: '\xF0\x9D\x94\xB9+)...' for column 'NAME_' at
暗夜荆棘鸟
博客等级 码龄12年 9粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值