事件委託,js事件委託
先來解釋一下啥是事件委託:
事件委託就是:子項目的事件,委託給他的父級
先來個例子看看:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>無標題文檔</title>
<style type="text/css">
*{margin:0; padding:0}
ul,li{ list-style:none;}
#ul{ overflow:hidden;}
li{width:100px; height:100px; background:red; margin:20px; float:left;}
</style>
<script type="text/javascript">
window.onload=function()
{
var oUl=document.getElementById("ul");
var oBtn=document.getElementById("btn");
var aLi=oUl.children;
oUl.onclick=function(ev)
{
var oEvent=ev || event;
var oTag=oEvent.srcElement || oEvent.target;
if(oTag.tagName=="LI")
{
oTag.style.background="pink";
}
}
oBtn.onclick=function()
{
var oLi=document.createElement("li");
oLi.style.width="100px";
oLi.style.height="100px";
oUl.appendChild(oLi);
}
}
</script>
</head>
<body>
<input type="button" id="btn" value="追加" >
<div id="ul">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</div>
</body>
</html>
在這個例子中,點擊li,當前這個li的就會變色
從代碼中可以看出,事件是綁定在父級上的,但是點擊每個li,li就會變色,這個就是典型的事件委託
事件委託有兩個好處:
1.減少for迴圈,(大家都知道for迴圈是比較耗效能的吧,能不用就不用)
2.可以給未來元素加事件
在上面這個例子中,點擊按鈕後,可以追加li,而且點擊追加的li,任然可以變色
如果你不用事件委託來做,用以下這種方式來做的話,未來元素是沒有加上事件的哦:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>無標題文檔</title>
<style type="text/css">
*{margin:0; padding:0}
ul,li{ list-style:none;}
#ul{ overflow:hidden;}
li{width:100px; height:100px; background:red; margin:20px; float:left;}
</style>
<script type="text/javascript">
window.onload=function()
{
var oUl=document.getElementById("ul");
var aLi=oUl.children;
for(var i=0;i<aLi.length;i++)
{
aLi[i].index=i;
aLi[i].onclick=function()
{
this.style.background="pink";
}
}
var oBtn=document.getElementById("btn");
oBtn.onclick=function()
{
var oLi=document.createElement("li");
oLi.style.width='100px';
oLi.style.height='100px';
oUl.appendChild(oLi);
}
}
</script>
</head>
<body>
<input type="button" id="btn" value="追加" >
<div id="ul">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</div>
</body>
</html>
對比運行以下 看看結果哦
又不懂的地方 歡迎提問哦~
C#裡事件與委託有什不同?
事件就是一個狹義的委託,也就是事件是一個用於事件驅動模型的專用委託.
通俗的講,委託你可以在客戶代碼中直接調用委託來激發委託指向的函數,而事件不可以,事件的觸發只能由服務代碼自己觸發
也就是說在你的代碼裡委託你不但可以安排誰是它的調用函數,還可以直接調用它,而事件不能直接調用,只能通過某些操作觸發
你可以理解事件就是一個或多個委託,此話應該有誤的吧,事件可以有多個事件處理函數,委託同樣也可以是個多播委託
委託與事件
public CoreTypes.NodeCallBack NCallBack;
其實就是一個欄位,這個欄位類型是NodeCallBack,欄位的名字叫NCallBack
如果你這樣聲明
public event CoreTypes.NodeCallBack NCallBack;
就會定義一個事件,事件也是屬於這個委託類型的,但是他與這個委託類型的欄位是有區別的,這個事件在類外面訪問的時候,你是不能引發,或者說主動執行的,而聲明為一個public欄位的話,在類的外面就可以隨意操作了
最後一句是給這個欄位中包含的委託添加一個匿名方法
回答補充:
二樓說的沒錯,我再補充一下
使用event聲明的是一個事件,實際上在編譯的時候會產生兩個方法(add_XXX和remove_XXX)和一個欄位,你在類內部使用+= -=其實編譯的時候調用的是兩個方法,而取出事件中包含的委託則編譯時間直接存取欄位
但是在類的外面,你只能使用+= -=訪問add和remove方法,這樣就防止在類的外部直接修改委託中註冊的處理器,保護類不被惡意破壞,而也僅能在內部引發一個事件