-
定義:通俗的講,事件就是
onclick
,onmouseover
,onmouseout
等就是事件,委托呢,就是讓別人來做,這個事件本來是加在某些元素上的,然而你卻加到別人身上來做,完成這個事件。 - 原理:利用冒泡的原理,把事件加到父級上,觸發(fā)執(zhí)行效果。
- 好處:1. 減少dom的遍歷與dom操作,提高性能。2. 動態(tài)新添加的元素還會有之前的事件。
示例:鼠標放置到li上后改變當前l(fā)i背景色
html:
<ul id="ul">
<li>aaaaaaaa</li>
<li>bbbbbbbb</li>
<li>cccccccc</li>
</ul>
不用事件委托:
window.onload = function(){
var oUl = document.getElementById("ul");
var aLi = oUl.getElementsByTagName("li");
for(var i=0; i<aLi.length; i++){
aLi[i].onmouseover = function(){
this.style.background = "red";
}
aLi[i].onmouseout = function(){
this.style.background = "";
}
}
}
利用遍歷就可以做到li上面添加鼠標事件。
但是如果說我們可能有很多個li用for循環(huán)的話就比較影響性能。
使用事件委托:
window.onload = function(){
var oUl = document.getElementById("ul");
var aLi = oUl.getElementsByTagName("li");
/*
這里要用到事件源
*/
oUl.onmouseover = function(ev){
var ev = ev || window.event;
var target = ev.target || ev.srcElement;
if(target.nodeName.toLowerCase() == "li"){
target.style.background = "red";
}
}
oUl.onmouseout = function(ev){
var ev = ev || window.event;
var target = ev.target || ev.srcElement;
if(target.nodeName.toLowerCase() == "li"){
target.style.background = "";
}
}
}
這樣,當鼠標在li上時,根據(jù)事件冒泡,由當前節(jié)點(當前l(fā)i節(jié)點觸發(fā)了ul的mouseover事件)自下而上觸發(fā)事件,當節(jié)點對象是li時執(zhí)行我們的操作。避免了dom遍歷。
??此外,和事先遍歷dom為每個li綁定事件不同,事件委托的方式是將事件綁定在ul上,所以在運行時動態(tài)添加的li上仍有效果。
術(shù)語解釋:
-
事件對象: 如上代碼,當
onmousemove
事件發(fā)生時,就會產(chǎn)生一個事件對象
,就是程序中的event對象
。 -
獲取事件對象:
var e = event || window.event
;IE下是window.event
,標準下是event
- 事件源:事件源,在事件中,當前操作的那個元素就是事件源。
-
獲取事件源:IE:
window.event.srcElement
,標準:event.target
-
target.nodeName
:找到元素的標簽名
*筆記整理自博客園