自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

談JavaScript中的事件委托

開發(fā) 前端
本文介紹的是JavaScript中的事件和委托,希望對你有幫助,一起來看。

事件是對象發(fā)送的消息,以發(fā)信號通知操作的發(fā)生。委托是可保存對方法的引用的類。下面介紹javascript中的事件和委托,供參考。

由于事件處理程序可以為現(xiàn)代Web應(yīng)用程序提供交互能力,因此許多開發(fā)人員會(huì)不分青紅皂白地向頁面中添加大量的處理程序,在創(chuàng)建GUI的語言(如#C)中,為GUI中的每個(gè)按鈕添加一個(gè)onclick事件處理程序是司空見慣的事,而且這樣做也不會(huì)導(dǎo)致什么問題??墒窃贘avaScript中,添加到頁面上的事件處理程序數(shù)量關(guān)系到頁面的整體運(yùn)行性能。

導(dǎo)致這一問題的原因是多方面的。首頁,每個(gè)都是對象,都會(huì)占用內(nèi)存;內(nèi)存中的對象越多,性能就越差。其次,必須事先指定所有事件處理程序而導(dǎo)致DOM訪問次數(shù),會(huì)延遲整個(gè)頁面的交互就緒時(shí)間。事實(shí)上,從如何利用好事件處理程序的角度出發(fā),還是有一些方法能夠提升性能的。

對“事件處理程序過多”問題的解決方案是事件委托。事件委托利用了事件冒泡,只指定一個(gè)事件處理程序,就可以管理某一類型的所有事件。例如,click事件會(huì)一直冒泡到document層次。也就是說,我們可以為整個(gè)頁面指定一個(gè)onclick事件處理程序,而不必給每個(gè)可單擊的元素分別添加事件處理程序。以下面的HTML代碼為例:

 

  1. <ul id="myLinks"> 
  2. <li id="goSomewhere">Go somewhere</li> 
  3. <li id="doSomething">Go somewhere</li> 
  4. <li id="sayHi">Say hi</li> 
  5. </ul> 

其中包含3個(gè)被單擊后會(huì)執(zhí)行操作的列表項(xiàng)。按照傳統(tǒng)的做法是,需要像下面這樣為它們添加3個(gè)事件處理程序:

  1. var item1=document.getElementById("goSomewhere");  
  2. var item1=document.getElementById("doSomething");  
  3. var item1=document.getElementById("sayHi");  
  4. EventUtil.addHandler(item1,"click",function(event){  
  5. location.href="http://www.yiiyaa.net";  
  6. });  
  7. EventUtil.addHandler(item2,"click",function(event){  
  8. document.title="I changed the document's title";  
  9. });  
  10. EventUtil.addHandler(item2,"click",function(event){  
  11. alert("Say hi");  
  12. }); 

如果在一個(gè)復(fù)雜的Web應(yīng)用程序中,對所有可單擊的元素都采用這種形式,那么結(jié)果就會(huì)有數(shù)不清的代碼用于添加事件處理程序。此時(shí),可以利用事件委托技術(shù)解決這個(gè)問題。使用事件類型,只需在DOM樹中盡量***的層次上添加一個(gè)事件處理程序,如下面的例子所示:

  1. var list=document.getElementById("myLinks");  
  2. EventUtil.addHandler(list,"click",function(event){  
  3. event=EventUtil.getEvent(event);  
  4. var target=EventUtil.getTarget(event);  
  5. switch(target.id){  
  6. case "doSomething":  
  7. document.title="I changed the document's title";   
  8. break;  
  9. case "goSomewhere":  
  10. location.href="http://www.yiiyaa.net";  
  11. break;  
  12. case "sayHi":  
  13. alert("Say hi");  
  14. break;  
  15. }  
  16. }); 

在這段代碼里,我們使用事件委托只為<ul>元素添加了一個(gè)onclick事件處理程序,由于所有列表項(xiàng)都是這個(gè)元素的子節(jié)點(diǎn),而且它們的事件會(huì)冒泡,所以單擊事件最終會(huì)被這個(gè)函數(shù)處理。我們知道,事件目標(biāo)是被單擊的列表項(xiàng),故而可以通過檢測id屬性來決定采用適當(dāng)?shù)牟僮鳌Ec前面未使用事件委托的代碼比一比,會(huì)發(fā)現(xiàn)這段代碼的事前消耗更低,因?yàn)橹蝗〉昧艘粋€(gè)DOM元素,只添加了一個(gè)事件處理程序。雖然對用戶來說最終的結(jié)果相同。但這種技術(shù)需要占用的內(nèi)存更少。所有用到按鈕的事件(多數(shù)鼠標(biāo)事件和鍵盤事件)都適合采用事件委托技術(shù)。

如果可行的話,也可以考慮為document對象添加一個(gè)事件處理程序,用以處理頁面上發(fā)生的某種特定類型的事件。這樣做與采取傳統(tǒng)的做法相比具有如下優(yōu)點(diǎn):

1、document對象很快就可以訪問,而且可以在頁面生命周期的任何時(shí)點(diǎn)上為它添加事件處理程序(無需等待DOMContentLoaded或load事件)。換句話說,只要可單擊的元素呈現(xiàn)在頁面上,就可以立即具備適當(dāng)?shù)墓δ堋?/p>

2、在頁面中設(shè)置事件處理程序所需的時(shí)間更少。只添加一個(gè)事件處理程序所需的DOM引用更少,所花的時(shí)間也更少。

3、整個(gè)頁面占用的內(nèi)存空間更少,能夠提升整體性能。

最適合采用事件委托技術(shù)的事件包括click,mousedown,mouseup,keydown,keyup和keypress,雖然mouseover和mouseout事件也冒泡,但要適當(dāng)處理它們并不容易,而且經(jīng)常需要計(jì)算元素的位置(因?yàn)楫?dāng)鼠標(biāo)從一個(gè)元素移到其他子節(jié)點(diǎn)時(shí),或者當(dāng)鼠標(biāo)移出該元素時(shí),都會(huì)觸發(fā)mouseout事件)。

本文地址: http://www.yiiyaa.net/1357

【編輯推薦】

  1. JavaScript重構(gòu)深入剖析
  2. Javascript繼承機(jī)制的設(shè)計(jì)思想
  3. JavaScript初學(xué)者必須注意的七個(gè)細(xì)節(jié)
  4. Javascript閉包(closure) 深入淺出
  5. 用Javascript獲取頁面元素的位置
責(zé)任編輯:于鐵 來源: yiiyaa.net
相關(guān)推薦

2016-09-14 21:28:25

JavaScript事件代理委托

2011-06-16 14:23:43

JavaScript空事件處理程序

2009-08-18 11:08:24

.Net Framew

2022-07-28 08:34:59

事件委托JS

2024-05-16 13:36:04

C#委托事件

2009-08-03 13:23:04

C#編程組件-事件-委托

2024-05-15 09:11:51

委托事件C#

2009-09-08 15:28:24

C#委托

2024-06-28 10:19:02

委托事件C#

2011-06-30 10:28:50

C#開發(fā)

2024-06-25 08:43:25

C#編程模型

2009-06-17 09:48:11

javascript手事件參考

2009-09-10 15:32:54

事件與委托

2011-06-16 15:14:17

VB.NET事件委托

2024-02-04 17:16:22

ReactVue前端

2009-08-18 10:54:17

C#事件和委托

2009-08-04 13:53:58

C#委托類C#事件

2021-11-11 11:24:54

JavaScript模型事件

2025-03-19 10:22:09

JavaScript編程語言開發(fā)

2009-03-26 10:11:47

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號