1. 程式人生 > >例項分析JavaScript中的事件委託和事件繫結

例項分析JavaScript中的事件委託和事件繫結

 我們在學習JavaScript中,難免都會去網上查一些資料。也許偶爾就會遇到“事件委託”(也有的稱我“事件代理”,這裡不評論誰是誰非。以下全部稱為“事件委託”),尤其是在查JavaScript的事件處理的時候。但是,大多數時說的是“事件繫結”,對於“事件委託”,或是不提,或是淺嘗輒止。對於我這個比較好奇的人來說,實在很蛋疼。尤其是想更多的瞭解“事件委託”的時候。

  這次乾脆一勞永逸,自己把查出來的資料整理成一篇日誌,總結這塊的知識,也方便需要的朋友查閱。

JavaScript中事件傳播過程那些事兒

  早期的web開發,瀏覽器廠商很難回答一個哲學上的問題:當你在頁面上的一個區域點選時,你真正感興趣的是哪個元素。這個問題帶來了互動的定義。在一個元素的界限內點選,顯得有點含糊。畢竟,在一個元素上的點選同時也發生在另一個元素的界限內。例如單擊一個按鈕。你實際上點選了按鈕區域、body元素的區域以及html元素的區域。

  伴隨著這個問題,兩種主流的瀏覽器Netscape和IE有不同的解決方案。Netscape定義了一種叫做事件捕獲的處理方法,事件首先發生在DOM樹的最高層物件(document)然後往最深層的元素傳播。在圖例中,事件捕獲首先發生在document上,然後是html元素,body元素,最後是button元素。

  IE的處理方法正好相反。他們定義了一種叫事件冒泡的方法。事件冒泡認為事件促發的最深層元素首先接收事件。然後是它的父元素,依次向上,知道document物件最終接收到事件。儘管相對於html元素來說,document沒有獨立的視覺表現,他仍然是html元素的父元素並且事件能冒泡到document元素。所以圖例中噢噢那個button元素先接收事件,然後是body、html最後是document。如下圖:

JavaScript事件冒泡和事件捕捉

圖1-JavaScript時間冒泡和捕捉
事件冒泡:

  什麼是“事件冒泡”呢?假設這裡有一杯水,水被用某種神奇的方式分成不同顏色的幾層。這時,從最底層冒出了一個氣泡,氣泡會一層一層地上升,直到最頂層。而你不管在水的哪一層觀察都可以看到並捕捉到這個氣泡。好了,把“水”改成“DOM”,把“氣泡”改成“事件”。這就是“事件冒泡”。

  氣泡帶上了某種資訊,會告訴其經過的每一層自己是在哪一層產生的。JavaScript的事件確實會帶著這個屬性。當程式捕獲一個事件的時候,它會知道這個事件來自於頁面上哪個元素。 事件委託也就是利用這個原理。

事件委託和事件繫結的簡介

  事件繫結的介紹,網上比比皆是,大家也比較熟悉,D瓜哥文筆不好,就不獻醜了。

  下面我們來重點介紹一下“事件委託”。其實,“事件委託”的概念很簡單,生活中也不乏這樣的例子。比如,有三個同事預計會在週一收到快遞。為簽收快遞,有兩種辦法:一是三個人在公司門口等快遞;二是委託給前臺MM代為簽收。現實當中,我們大都採用委託的方案(公司也不會容忍那麼多員工站在門口就為了等快遞)。前臺MM收到快遞後,她會判斷收件人是誰,然後按照收件人的要求籤收,甚至代為付款。這種方案還有一個優勢,那就是即使公司裡來了新員工(不管多少),前臺MM也會在收到寄給新員工的快遞後核實並代為簽收。

事件委託和事件繫結的程式碼實現

  事件繫結的程式碼,網上一抓一把。這裡只給出一個簡單程式碼。諸如:

1 document.getElementById("id").onclick=function(){
2 //這裡是事件處理程式碼
3 }

  D瓜哥在第一次注意到事件委託的時候,明白這個大概意思。不過,陸游他老人家有句話說的好,“紙上得來終覺淺,絕知此事要躬行。”英語有一個很“心領神會”的一句話,是世界著名計算機專家Donald Knuth說的,”An algorithm must be seen to be believe!“D瓜哥從第一次注意到“事件委託”後,就考慮用程式碼如何實現。相信,這也是很多人第一次注意到“事件委託”的想法吧。哈哈

  這裡給大家一個簡要的示例。示例如下:

01 //document.onclick,從這點就能看出,這個示例把事件委託放到了document上。
02 document.onclick = function(event){
03 //IE doesn't pass in the event object
04 event = event || window.event;
05
06 //IE uses srcElement as the target
07 var target = event.target || event.srcElement;
08
09

相關推薦

例項分析JavaScript事件委託事件

 我們在學習JavaScript中,難免都會去網上查一些資料。也許偶爾就會遇到“事件委託”(也有的稱我“事件代理”,這裡不評論誰是誰非。以下全部稱為“事件委託”),尤其是在查JavaScript的事件處理的時候。但是,大多數時說的是“事件繫結”,對於“事件委託”,或是

分分鐘用上C#委託事件

  每一個初學C#的程式猿,在剛剛碰到委託和事件的概念時,估計都是望而卻步,茫然摸不到頭腦的。百度一搜,關於概念介紹的文章大把大把的,當然也不乏深入淺出的好文章。可看完這些文章,大多數新手,估計也只是信心滿滿的覺得自己看懂了,一旦要在自己的程式中用上委託和事件,就傻眼了,根本不知道什麼情況下該用,也不知

C#委託事件---通俗易懂

每一個初學C#的程式猿,在剛剛碰到委託和事件的概念時,估計都是望而卻步,茫然摸不到頭腦的。百度一搜,關於概念介紹的文章大把大把的,當然也不乏深入淺出的好文章。可看完這些文章,大多數新手,估計也只是信心滿滿的覺得自己看懂了,一旦要在自己的程式中用上委託和事件,就傻眼了,根本不知

C# 委託事件(轉)

引言 委託 和 事件在 .Net Framework中的應用非常廣泛,然而,較好地理解委託和事件對很多接觸C#時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡別(biè)得慌,混身不自在。本文中,我將通過兩個範例由淺入深地講述什麼

【轉載】C# 委託事件(詳解:簡單易懂的講解) C# 委託事件(詳解)

本文轉載自http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html C# 中的委託和事件(詳解) C# 中的委託和事件

C# 委託事件

 更新記錄:2007年  9月28日:事件的由來  引言 委 託 和 事件在 .Net Framework中的應用非常廣泛,然而,較好地理解委託和事件對很多接觸C#時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真 是太容易了,而沒有過去的人每次見到委託和事

C# 委託事件(詳解)

C# 中的委託和事件        委託和事件在 .NET Framework 中的應用非常廣泛,然而,較好地理解委託和事件對很多接觸 C# 時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡堵得慌,渾身不自在。本章中,我將由淺入深

C#委託事件(提及Observer設計模式)(轉載)

原連結:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx 引言 委託 和 事件在 .Net Framework中的應用非常廣泛,然而,較好地理解委託和事件對很多接

徹底搞清楚c#委託事件

一、什麼是委託呢? 聽著名字挺抽象,確實不好理解。面試官最喜歡考察這個,而且更喜歡問:“委託和事件有何異同?”。如果對一些知識點沒有想明白,那麼很容易被繞進去。研究任何事物,我們不妨從它的定義開始,委託也不例外。那麼先來看c#中的委託定義,先來個例子: public deleg

C#委託事件(一)

引言 委 託 和 事件在 .Net Framework中的應用非常廣泛,然而,較好地理解委託和事件對很多接觸C#時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真 是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡別(biè)得慌,混身不自在。本文中,我將通過兩個範例由淺入深地講述什麼是

js事件捕獲事件冒泡,以及由事件冒泡引入的事件委託

事件模型 首先我們認識一下事件模型: 上圖轉自:https://zhuanlan.zhihu.com/p/26536815 由上圖所示,事件模型分為三個階段: 捕獲階段 目標階段 冒泡階段 在IE8及其以前,IE瀏覽器監聽事件的API為attac

C#委託事件的區別

大致來說,委託是一個類,該類內部維護著一個欄位,指向一個方法。事件可以被看作一個委託型別的變數,通過事件註冊、取消多個委託或方法。本篇分別通過委託和事件執行多個方法,從中體會兩者的區別。   □ 通過委託執行方法 class Program { st

javascript事件委託jquery事件委託

元旦過後,新年第一篇。 初衷:很多的面試都會涉及到事件委託,前前後後也看過好多博文,寫的都很不錯,寫的各有千秋,自己思前想後,為了以後自己的檢視,也同時為現在找工作的前端小夥伴提供一個看似更全方位的解讀事件委託的地方來認識瞭解他的原理,本篇文章彙總了兩個版本的事件委託:javascript、jquery;

C#呼叫外部exe的使用、呼叫powershell、退出程序、委託事件

針對幾種情況,簡單總結學習一下竟然找到一個超級簡單的方法呼叫exe檔案程式碼就一句,並且呼叫的效果特別好。加上後面的.WaitForExit()就是為了等呼叫的程式執行完後再執行下面的程式碼,沒有後面的.WaitForExit() 無需等待程式完成後執行程式碼。System.

例項javascript的window物件的onbeforeunload、onload、onunload的區別(在新版本的瀏覽器兩個關閉事件可能不會觸發)

onload是在頁面載入的時候觸發,與之相反onunload是在頁面關閉(解除安裝)的時候觸發,至於onbeforeunload是指頁面將要關閉的時候觸發(一般用於彈出是否確認關閉的時候) 上程式碼 <!DOCTYPE HTML PUBLIC "-//W3C//DT

通過一個WPF例項進一步理解委託事件

在前寫過“淺談C#中的委託”和“淺談C#中的事件”兩篇部落格,內容有些抽象,似乎難以說明委託和事件的關係。 今天通過一個小程式來進一步說明二者的使用及聯絡。 首先新建一個WPF應用程式,取名TestDelegateAndEvent。 在.xmal中加入

C#委託事件的簡單例項

# 委託 C#裡這個委託我的理解是可以看成是一個**方法模板的型別**。(不過並沒有找到相關的理解 比如有幾個返回值,引數列表型別相同的方法,就能用同個模板型別來表示,然後例項化一個委託型別就繫結上一個或多個方法,然後就可以一次呼叫這多個方法,相當於把方法物件化?。 ```c# using System; n

Javascript事件物件事件型別

#### *接上次看JS的事件冒泡和捕獲,所以順帶就把`事件`相關的知識都看完好了* #### *而且想到一個好的學習方法,第一天自己看,第二天把前一天學習的東西寫下來,一方面可以當複習,一方面當重新整理並且分享* ---- ## 事件物件 事件處理程式函式在處理事件時,或者說`DOM`在觸發某個事件

JavaScript事件代理事件委托

遍歷 我們 重繪 down 核心 on() his 事件代理 lur 一、概述:   那什麽叫事件委托呢?它還有一個名字叫事件代理,JavaScript高級程序設計上講:事件委托就是利用事件冒泡,只指定一個事件處理程序,就可以管理某一類型的所有事件。那這是什麽意思呢?網上

C#使用委託事件實現釋出訂閱者模式

事件是C#中的高階概念,和js中的滑鼠點選$("tag").click,懸停$("tag").hover或css元素樣式的改變(onChanged)等事件,當事件觸發才執行我們所委託的方法。 步驟: 1、建立一個委託; 2、將建立的委託與特定事件關聯; 3、編寫C#事件處理程式; 4、利用編