在说事件委托以前,先介绍一下事件冒泡。javascript
根据红宝书,事件开始是由最具体的元素接受,而后逐级传播到较为不具体的节点
例如:html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div></div> </body> </html>
若是单击了div,则click事件会按照以下顺序传播
(1)div
(2)body
(3)html
(4)documentjava
由于事件冒泡的原理,咱们就能够将事件绑定在不具体的父元素上,点击具体的子元素,触发其父元素的事件,这就是事件委托。node
事件委托就是讲事件监听器加在所要绑定元素的父元素上,为避免给每一个特定的节点增长事件监听,避免在特定节点被删除时还要再删除它的绑定事件。
例子:bootstrap
<ul id="parent-list"> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> <li>Item 4</li> <li>Item 5</li> <li>Item 6</li> </ul> // 找到父元素,添加监听器... document.getElementById("parent-list").addEventListener("click",function(e) { // e.target是被点击的元素! // 若是被点击的是li元素 if(e.target && e.target.nodeName == "LI") { // do something } });
而后,再介绍jQuery事件委托。框架
这是我在调用bootstrap框架时要使用bootstrap的日历控件this
<input type="text" class="datetimepicker">
发现若是是动态添加的元素,没法为新添加的元素增长事件,因此是无效的,因此咱们应该将点击生成日历控件这个方法绑定在它的父元素上,使用jQuery中的on方法spa
$(selector).on(event,childSelector,data,function,map),
具体实现:code
$parent.on("focus",".datetimepicker",function(){ $(this).datetimepicker({ language: 'fr', format:'yyyy-mm-dd', todayBtn: 1, autoclose: 1, todayHighlight: 1, startView: 2, minView: 2, forceParse: 0 }); }); 还有一个方法是live(),不过在jQuery1.7中已被废弃,由on()取代,就不提啦。