事件委托也稱事件代理喧伞。
這里舉一個(gè)例子:有三個(gè)同事預(yù)計(jì)會(huì)在周一收到快遞走芋。為簽收快遞绩郎,有兩種辦法:一是三個(gè)人在公司門口等快遞;二是委托給前臺(tái)代為簽收∥坛眩現(xiàn)實(shí)當(dāng)中肋杖,我們大都采用委托的方案(公司也不會(huì)容忍那么多員工站在門口就為了等快遞)。前臺(tái)收到快遞后挖函,她會(huì)判斷收件人是誰(shuí)状植,然后按照收件人的要求簽收。這種方案還有一個(gè)優(yōu)勢(shì)挪圾,那就是即使公司里來(lái)了新員工浅萧,前臺(tái)也會(huì)在收到寄給新員工的快遞后核實(shí)并代為簽收
這里其實(shí)還有2層意思:
第一,現(xiàn)在委托前臺(tái)的同事是可以代為簽收的哲思,即程序中的現(xiàn)有的dom節(jié)點(diǎn)是有事件的;
第二吩案,新員工也是可以被前臺(tái)代為簽收的棚赔,即程序中新添加的dom節(jié)點(diǎn)也是有事件的。
原理:事件委托是利用事件的冒泡原理來(lái)實(shí)現(xiàn)的徘郭,事件冒泡就是事件從最深的節(jié)點(diǎn)開(kāi)始靠益,然后逐步向上傳播事件。比如:頁(yè)面上有這么一個(gè)節(jié)點(diǎn)樹(shù)残揉,div>ul>li>a;比如給最里面的a加一個(gè)click點(diǎn)擊事件胧后,那么這個(gè)事件就會(huì)一層一層的往外執(zhí)行,執(zhí)行順序a>li>ul>div抱环,有這樣一個(gè)機(jī)制壳快,那么我們給最外面的div加點(diǎn)擊事件,那么里面的ul镇草,li眶痰,a做點(diǎn)擊事件的時(shí)候,都會(huì)冒泡到最外層的div上梯啤,所以都會(huì)觸發(fā)竖伯,這就是事件委托,委托它們父級(jí)代為執(zhí)行事件因宇。
實(shí)現(xiàn):
css:
ul{
????background: yellow;
}??
li{
????border: 1px solid gray;
????width: 500px;
????height: 30px;
}
html:
<ul>
????<li>0</li>
????<li>1</li>
????<li>2</li>
????<li>3</li>
????<li>4</li>
????<li>5</li>
????<li>6</li>
????<li>7</li>
</ul>
js:
var ul = document.getElementsByTagName("ul")[0];???
//var ul = document.querySelector("ul");
/*
var lis = document.querySelectorAll("li");
var len = lis.length;
for(var i=0; i<len; i++){
????lis[i].onclick= function(){
????????ul.removeChild(this);
????}
}
*/
// 事件委托
ul.onclick= function(event){
????var evt= event|| window.event;
????var tar= evt.target || evt.srcElement; // 鼠標(biāo)所點(diǎn)擊的目標(biāo)元素
????console.log( tar );
????console.log( this );
????console.log( tar.nodeName );
????if( tar.nodeName.toUpperCase() == "LI" ){
????????ul.removeChild(tar);
????}
}