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
uniapp+google map不显示 uniapp+renderJS+google map开发安卓版APP非小程序,google map小叉号不显示,google map自定义marker右上角的小叉号如何去掉,uniapp+google map不显示 阅读详情

相关推荐

NXP ChessDE的安装和激活

如果客户申请的是试用版,那么一份为期 30 天的 License 将会发送申请人的账号或邮箱中,客户使用该文件进行安装即可。② 将“VENDOR snpslmd /path/to/snpslmd”中的“/path/to/snpslmd”替换成 snpslmd.exe 实际存放路径(位于 SCL 安装目录下的 win32\bin 文件夹中,默认安装的情况下就是“VENDOR snpslmd C:\Synopsys\SCL\<version>\win32\bin\snpslmd.exe”)。

weixin_47351160的博客 2043

jQuery事件委托

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

m0_67388537的博客 840

【华为2021校招】笔试题【通用硬件】

时间:2020/07/15 19:00 时长:60min 题型:40单选+5多选 难度:中等 考察范围:模电、数电、SI、EMC、电源、微机原理、计算机网络、材料

Jkcia的博客 4万+

Jquery 事件委托(代理)

Jquery 事件委托(代理)

sinat_39670720的博客 626

库卡机器人负载设置和自动负载测算

1.1在专家或者以上的权限下—“投入运行”——“工具/基座标管理”—“工具/工件”—添加1.2根据当前的工具所在的tool选择指定工具号;若是没有建立tool需要先建立建立方法看1.3负载数据的填写质量:抓手自重+产品重量总和(需要小于额定负载值)X、Y、Z :总质量的重心位置(基于法兰盘中心的位置计算,如下图的X_FLANGE、Y_FLANGE、Z_FLANGE)【此数据可以根据仿真或者CAD数据得出】A、B、C:是总质量绕着法兰盘中心所安装的角度位置 【此数据可以根据仿真或者CAD数据得出】

weixin_43462131的博客 3101

模电学习笔记(十二)——跨阻放大器

模电学习笔记(十二) 跨阻放大器 跨组运算放大器是将电流信号转换成为电压信号,电流到电压增益基于反馈电阻。 设计目标: 输入 输出 带宽 电源 0A 100uA 0V 7V 20kHz 15V -15V 1.计算R1的值(增益电阻器) 2.计算C1的值满足电路带宽 ...

tang11081023的博客 2万+

【Javascript】【jQuery】jQuery事件代理

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

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

dreamerv3复现教程

由于dreamerv3存在很多版本冲突问题,所以很难直接使用和复现。

无人机飞啊飞啊飞 2833

JQuery 事件&事件代理

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

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

Isaac Lab 强化学习全身控制策略 Sim2Real 宇树人形机器人训练部署 HOVER

《IsaacLab策略训练与部署指南》提供了在仿真和真实机器人上实现HOVER全身控制策略的完整流程。主要内容包括:1) Linux环境下的IsaacLab安装与HOVER资源库配置;2) 使用1024个并行环境训练教师/学生策略的详细步骤;3) 策略测试与评估方法;4) Sim2Sim仿真验证和Sim2Real真实机器人部署方案。本教程特别针对Unitree H1仿人机器人,包含运动数据准备、策略训练、性能评估到硬件部署的全链条实现方案,为机器人控制策略开发提供标准化参考框架。

机器人控制与仿真应用 3070

(王道计算机组成原理)第二章数据的表示和运算-第三节:运算方法和运算电路 1(基本运算部件)

本文主要介绍了计算机组成原理中的加法器和算术逻辑单元(ALU)的基本概念与实现原理。首先,文章详细讲解了一位全加器的工作原理,包括其输入输出、逻辑表达式及真值表。接着,介绍了并行加法器的两种类型:串行进位和并行进位的加法器,分析了它们的优缺点。随后,文章探讨了带标志位的加法器,说明了如何通过标志位生成逻辑来判断加法结果的状态。最后,文章阐述了ALU的功能及其实现原理,包括ALU的基本结构、控制信号的作用以及在实际考试中的图示表示。通过这些内容,读者可以全面了解加法器和ALU在计算机中的重要作用及其工作原理。

快乐江湖的博客 3837

jQuery的事件绑定与事件委托

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

aiolos1111的专栏 1万+

PLC如何控制电子膨胀阀(暖通空调/制冷系统)

电子膨胀在冷水机空调系统里广泛采用,大部分空调系统都会有电子膨胀阀,但是电子膨胀阀的控制接口和普通电磁阀完全不同,所以想要PLC直接控制电子膨胀阀,还是比较麻烦的,电子膨胀阀可以理解为一个简易步进电机,体积非常小,线圈和转子部分可以分离。下面我们看下PLC如何控制电子膨胀阀。

RXXW_Dor的博客 4760

js阻止时间冒泡

weixin_42488377的博客 434

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

敲敲的博客 1885

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

javascript时间冒泡和事件捕获

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

qq_33418050的博客 732

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

轻松理解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、付费专栏及课程。

余额充值