前端事件系統(四)

發表於2015-11-13

編前語:事件是前端之中,非常重要的一個部分。其作用在於對於使用者的各種行為進行相應。前端事件系統(一)中主要介紹事件的繫結方式和事件處理;前端事件系統(二)中主要介紹JQuery事件繫結;前端事件系統(三)中主要介紹on與event.add方法。

 

事件派發


首先來看看jQuery.event的dispatch方法

 

通讀整段程式碼,歸納一下,jQuery.event.dispatch是做了一下幾項處理的

  1. 對event物件進行修復
  2. 讀取事件控制程式碼
  3. 取得事件佇列並對其進行處理

先看第一點

對event物件的修復,這一步得到event物件,是jQuery的event物件,而非原生的物件。這裡jQuery將原本只讀的物件,變為了一個可讀可寫的物件,這樣就可以對其進行隨意操作了。不過對於event物件修復,我打算現將其放到下一章與事件的修復一起進行講解,因此這裡只需要知道,這裡是返回的jQuery的event物件就行了。

第二點也不再多說,就是讀取了事件的快取

那麼來到第三點,也是事件分發的另外一個重點

事件佇列的獲取與處理。

在之前版本的jQuery中,佇列的生成與處理,都是放在了dispatch中進行,不過如今佇列已經交由jQuery.event.handlers生成並返回,那麼我們首先來看下獲取到了handlerQueue到底是什麼,即也就是對於jQuery.event.handlers來進行閱讀。

jQuery.event.handlers

這一部分,整體看來比較複雜,我們來理一下一下。

這部分先對事件代理做了判斷並進行了處理,採用match來對符合條件的事件控制程式碼做一個篩選,並將所有符合條件的事件控制程式碼,按從深及淺的順序,一一放入了事件佇列之中。

然後,在處理完成了事件代理之後,採用delegateCount區分事件代理以及直接繫結,再將直接繫結的事件控制程式碼,放入事件佇列之中,生成了最終的事件佇列。這樣,最終得到的,就是一個委託層次越深,便越會提前執行的事件佇列。

因此,事件委託,在這一步就已經完成了。同時,因為jQuery的事件處理機制,是這樣一個佇列的形式,因此,之前在第一章末尾所提及的,對於執行順序的問題,這裡也很好的解決了。

再回來看dispatch對於事件佇列的處理


那麼最後,我們來看dispatch中如何對於這個事件佇列進行的處理。

這一部對於事件佇列進行了有序的執行(由深及淺再到本身),然後,在這個過程中,通過已經修正過的jQuery事件物件,動態的改變event物件的屬性,在執行事件控制程式碼。同時,也對return false後,直接呼叫event.preventDefault(),與event.stopPropagation()進行了處理。

總結:


那麼,到目前,對於事件繫結這一塊,除了對於事件的修復部分,其他的部分都已經閱讀完畢。我們到最後再來理一下整個的過程。

  1. 首先,繫結時,採用了on方法,在這個過程中,on對於我們繫結時候,所傳進來的引數,一一進行了處理,並最終將其傳入jQuery.event.add中來執行。
  2. event.add部分,引用了dispatch方法進行了事件分發,並將事件名與事件控制程式碼進行了填充
  3. dispatch部分,對於event物件進行修復,讀取事件控制程式碼,同時取得事件佇列並對其進行處理,並執行回撥。

那麼下一章,將對jQuery事件物件的修復,以及事件的修復,進行一個講解。

相關文章