jquery事件委托的原理和用途

事件委托

声明:这一篇文章只是阐述了委托事件的原理和用委托的好处还有就是在什么时候要委托合适.在这里用的是on()和off()而对于委托的其他方法(delegate()、live()等)和各个方法的比较在这里并没有详细阐述,以后如果有机会在发一篇

1.什么是委托呢?

a)定义:把一件事交给别人代做就叫做委托

b)问题:为什么要把事交给别人来做呢?

原因很简单:第一、自己不想做,所以交给别人 第二、自己不会做,所以交给别人来做 第三、让别人来做这一件事更有优势等等(这也是为什么要使用委托的原因)

c)为了方便理解举个简单例子(转载:http://www.cnblogs.com/secying/archive/2012/03/22/2411780.html):有三个同事预计会在周一收到快递。为签收快递,有两种办法:一是三个人在公司门口等快递;二是委托给前台MM代为签收。现实当中,我们大都采用委托的方案(公司也不会容忍那么多员工站在门口就为了等快递)。前台收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚至代为付款。这种方案还有一个优势,那就是即使公司里来了新员工(不管多少),前台也会在收到寄给新员工的快递后核实并代为签收(即让前台来做这件事更具优势)。 这个样子理解就比较容易懂了

2.那事件委托呢(至于什么是事件就不再这里阐述,不懂的朋友请自己谷歌)?如果将事件比作是一件要做的事,那么事件委托即将事件这件事交个别人来做,而在js里面就是将一个事件交给别的元素代劳

3.Jquery是怎么具体实现事件委托?

a)事件委托的例子,看下面代码:

<head>

<script type="text/javascript" src="js/jquery-1.9.1.min.js"></script>

<scrpty type="text/JavaScript">

$(function(){

//将span的单击事件委托给div

$(‘div‘).on(‘click‘,‘span‘,function(e){alert("this is span label");});

//单击span标签-执行结果弹出 this is span label

});

</scrpty>

</head>

<body>

<div>

<span id="span">hello</span>

<input type="text" >

</div>

</body>

分析以上的代码其实click事件是绑定在div这个元素上的,所以按道理点击div这个事件是会触发的,但事实是不会.让我们来分析一下原因(委托实现的原理):

第一、委托的事件是以冒泡的形式向外传播的所以只要点击div的子元素都会触发委托的事件

第二、当事件传播到被委托元素(这里指div)的时候会首先判断e.type和e.target这两个属性.

综合以上两点只有点击委托事件的元素(这里指span)才会触发绑定在div元素上的单击事件

b)分析以下一种情况,将以上js代码改成:

<scrpty type="text/JavaScript">

//只是为span标签绑定单击事件

$(‘span‘).on(‘click‘,function(e){alert("this is span label");});

//动态增加10个span标签

for(var i=0;i<10;i++){

$(‘.div‘).append($(‘<span>span1</span><br />‘));

}

</scrpty>

在这种情况下只有id为span的标签绑定了单击事件,而后面动态增加的span标签确没有,

在这种情况下怎么为后续的span标签添加事件呢?在添加span标签代码的后面加上                $(‘span‘).on(‘click‘,function(e){});是不是很简单呢?既然可以这样写那么委托有存在

的必要吗?

根据以上的第一点可知:委托的事件是绑定在一个以存在的元素上的,所以他只绑定一次,而$(‘span‘).on(‘click‘,function(e){});这段代码是为每一个span元素绑定一次,

就是说如果有200个span元素就要绑定两百次,增加的代码的冗余和降低了性能,所以委托不仅增强了性能而且增加了代码的可读性.

总结:一、为了给动态生成的元素增加事件时用委托 二、如果是一次性要给很多个相同的元素绑定事件时用委托 好处:增强性能和代码可读性

时间: 2024-08-09 20:35:29

jquery事件委托的原理和用途的相关文章

Jquery事件委托之Safari

什么是事件委托 事件委托是Jquery中一种事件绑定的方式,不同于常见的事件绑定方式将事件绑定在目标元素上,而是将事件绑定在父级元素上通过事件冒泡来执行绑定函数. //常见的事件绑定(Jquery) $(element).click(function(){ //do something }) //事件委托(Jquery) $(parents).on("click",element,function(){ //do something }) 事件委托的原理 事件委托将事件监听绑定在目标元

0173 事件委托:原理、作用

事件冒泡本身的特性,会带来的坏处,也会带来的好处. 1.3.8.1 什么是事件委托 事件委托:也称为事件代理,在 jQuery 里面称为事件委派. 把事情委托给别人,代为处理. 说白了就是,不给子元素注册事件,给父元素注册事件,把处理代码在父元素的事件中执行. 生活中的代理: js事件中的代理: 1.3.8.2 事件委托的原理 ? 给父元素注册事件,利用事件冒泡,当子元素的事件触发,会冒泡到父元素,然后去控制相应的子元素[利用事件冒泡影响每一个子节点]. 1.3.8.3 事件委托的作用 我们只操

js事件委托及其原理

1,什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件. 也就是:利用冒泡的原理,把事件加到父级上,触发执行效果. 好处呢:1,提高性能. 我们可以看一个例子:需要触发每个li来改变他们的背景颜色. <ul id="ul"> <li>aaaaaaaa</li> <li>bbbbbbbb&l

js的事件的三个阶段,事件委托的原理

DOM2级事件规定的事件流的三个阶段:捕获,目标,冒泡(IE8以及更早版本不支持DOM事件流); 事件流: IE:IE事件流是事件冒泡流  Netscape事件流是事件捕获流 IE事件流 叫做事件冒泡,即事件开始时由最具体的元素(文档中嵌套最深的那个节点)接收,然后逐级向上(一直到文档).事件捕获与事件冒泡事件流正好相反的顺序,事件捕获的事件流是最外层逐级向内传播. 使用DOM0级方法指定的事件处理程序被认为是元素的方法,处理程序是在元素的作用域进行的,程序中this是引用的是当前元素 btn

jquery事件委托详解

jQuery事件委托处理流程 上一章分析jQuery.event.add的时候已经分析了事件绑定,再把绑定的部分源码抽出来 if ( !(eventHandle = elemData.handle) ) { eventHandle = elemData.handle = function( e ) { //当一个事件被调用后页面已经卸载,则放弃jQuery.event.trigger()的第二个事件, return typeof jQuery !== core_strundefined &&

jQuery事件委托

随着DOM结构的复杂化和Ajax等动态脚本技术的运用,有了较多的动态添加进来的元素,直接用JQ添加click事件会发现新添加进来的元素并不能直接选取到,在这里就需要用到事件委托方法,JQ为事件委托提供了live().dalegate()和on()方法. 事件委托 我们知道,DOM在为页面中的每个元素分派事件时,相应的元素一般都在事件冒泡阶段处理事件.在类似 body > div > a 这样的结构中,如果单击a元素,click事件会从a一直冒泡到div和body(即document对象).因此

JavaScript, JQuery事件委托

1.引言 现实当中,前台MM收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚至代为付款.(公司也不会容忍那么多员工站在门口就为了等快递); 这种事件委托还有个好处,就是即便公司又来很多员工,前台MM照样可以签收新员工的快递,新员工即便刚来但一样拥有拿自己快件的方法: 2.概念 通俗来讲: 事件有:onclick.onmouseover.onmouseout等等:委托呢,就是让别人来做,这件事情本身是加在元素上,然而你却加载别人身上来做,完成事件: 3.原理 利用冒泡原理,将事件加在父

jquery事件委托遇到的小坑记录

<script type="text/javascript" src="../../lib/jquery-1.11.2.min.js"></script> $(document).on('click',"li", function() { //do something }); 这样的写法,在pc,安卓上都是木有问题的,但在苹果手机,平板上就没有效果, 改成: $("div#id").on('click'

【jQuery源码】事件委托

jQuery的事件绑定有几个比较优秀的特点: 1. 可以绑定不限数量的处理函数 2. 事件可以委托到祖先节点,不必一定要绑到对应的节点,这样后添加的节点也照样能被处理. 3. 链式操作 下面主要分析事件的委托设计.事件源我们成为委托节点,委托节点委托他的祖先节点替他执行事件处理,这个祖先节点被成为被委托节点. DOM的原生事件将处理绑定在相应的节点上,相应节点触发事件才能执行处理.将事件处理委托给祖先节点,这个事件处理是附加到祖先节点的.那么需要做到的是,原节点触发了事件,想要执行已经附加到祖先