不使用事件委托会有以下四个问题
第一:大量的事件绑定,性能消耗,而且还需要解绑(IE会泄漏)
第二:绑定的元素必须要存在
第三: 后期生成HTML会没有事件绑定,需要重新绑定
第四: 语法过于繁杂
事件委托利用事件冒泡原理,自己不处理事件,而是委托给父节点或者祖先元素甚至是根元素来处理。
jquery为此衍生出四种事件绑定函数
bind方法
live方法
delegate方法
on方法
- bind方法:
上一篇博文提到bind方法,bind方法不能实现事件委托,事件处理由自身来处理。
$('p').bind('click',function(){})
- live方法:
我是用的jquery 2.1.3版本 live方法已经被弃用了。
$('a').live('click', function() { alert("!")})
live事件是将a事件的click方法通过document来获取,即用document来委托目标事件。
前人总结的缺点如下:
- 在调用 .live() 方法之前,jQuery 会先获取与指定的选择器匹配的元素,这一点对于大型文档来说是很花费时间的。
- 不支持链式写法。例如,$(“a”).find(“.offsite, .external”).live( … ); 这样的写法是不合法的,并不能像期待的那样起作用。
- 由于所有的 .live() 事件被添加到 document 元素上,所以在事件被处理之前,可能会通过最长最慢的那条路径之后才能被触发。
- 在移动 iOS (iPhone, iPad 和 iPod Touch) 上,对于大多数元素而言,click 事件不会冒泡到文档 body 上,并且如果不满足如下情况之一,就不能和 .live() 方法一起使用:使用原生的可被点击的元素,例如, a 或 button,因为这两个元素可以冒泡到 document。
- 在 document.body 内的元素使用 .on() 或 .delegate() 进行绑定,因为移动 iOS 只有在 body 内才能进行冒泡。
- 需要 click 冒泡到元素上才能应用的 CSS 样式 cursor:pointer (或者是父元素包含document.documentElement)。但是依然需要注意的是,这样会禁止元素上的复制/粘贴功能,并且当点击元素时,会导致该元素被高亮显示。
- 在事件处理中调用 event.stopPropagation() 来阻止事件处理被添加到 document 之后的节点中,是效率很低的,因为事件已经被传播到 document 上。
- .live() 方法与其它事件方法的相互影响是会令人感到惊讶的。例如,$(document).unbind(“click”) 会移除所有通过 .live() 添加的 click 事件!
- delegate方法:
$('#element).delegate('a', 'click', function() { alert("!!!") });
第一个参数 css选择器
第二个参数 事件类型
第三个参数 callback函数
jQuery 扫描文档查找(‘#element’),并使用 click 事件和’a’这一CSS选择器作为参数把 alert 函数绑定到(‘#element)上。
任何时候只要有事件冒泡到$(‘#element)上,它就查看该事件是否是click事件,以及该事件的目标元素是否与CCS选择器相匹配。如果两种检查的结果都为真的话,它就执行函数。
on方法:
所有delegate(),live(),bind()方法内部都是调用的on方法。
undelegate(),unlive(),unbind()方法内部都是调用的off方法。
$('p').on('click',callback);