事件委託,js事件委託

來源:互聯網
上載者:User

事件委託,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方法,這樣就防止在類的外部直接修改委託中註冊的處理器,保護類不被惡意破壞,而也僅能在內部引發一個事件
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.