亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

章節
問答
課簽
筆記
評論
占位
占位

重寫事件對象

jQuery 為 dom 處理而生,那么處理兼容的手段自然是獨樹一幟了,所以:

jQuery對事件的對象的兼容問題單獨抽象出一個 fix 類,用來重寫這個事件對象

jQuery 利用 jQuery.event.fix() 來解決跨瀏覽器的兼容性問題,統一接口。

除該核心方法外,我們要根據事件的類型,統一接口的獲取,所以 jQuery 引入了 (jQuery.event) props、 fixHooks、keyHooks、mouseHooks 等數據模塊。

  1. props 存儲了原生事件對象 event 的通用屬性
  2. keyHook.props 存儲鍵盤事件的特有屬性
  3. mouseHooks.props 存儲鼠標事件的特有屬性。
  4. keyHooks.filter 和 mouseHooks.filter 兩個方法分別用于修改鍵盤和鼠標事件的屬性兼容性問題,用于統一接口。
  5. 比如 event.which 通過 event.charCode 或 event.keyCode 或 event.button 來標準化。

最后 fixHooks 對象用于緩存不同事件所屬的事件類別,比如:

fixHooks['click'] === jQuery.event.mouseHooks;
fixHooks['keydown'] === jQuery.event.keyHooks;
fixHooks['focusin'] === {};

從源碼處獲取對事件對象的操作,通過調用 jQuery.Event 重寫事件對象,將瀏覽器原生 Event 的屬性賦值到新創建的 jQuery.Event 對象中去。

event = new jQuery.Event( originalEvent );

event 就是對原生事件對象的一個重寫了,為什么要這樣,jQuery要增加自己的處理機制唄,這樣更靈活,而且還可以傳遞 data 數據,也就是用戶自定義的數據。

構造出來的新對象:

 

看圖,通過 jQuery.Event 構造器,僅僅只有一些定義的屬性與方法,但是原生的事件對象的屬性是不是丟了?

所以還需要把原生的的屬性給混入到這個新對象上,那么此時帶來一個問題,不同事件會產生了不同的事件對象,擁有不同的屬性,所以還有一套適配的機制,根據不同的觸發點去適配需要混入的屬性名。

擴展通過 jQuery.Event 構造出的新事件對象屬性

//擴展事件屬性
this.fixHooks[ type ] = fixHook =
    rmouseEvent.test( type ) ? this.mouseHooks :
        rkeyEvent.test( type ) ? this.keyHooks :
        {};

有一些屬性是共用的,都存在,所以單獨拿出來就好了。

props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),

然后把私有的與公共的拼接一下。

copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;

然后混入到這個新的對象上。

jQuery 自己寫了一個基于 native event 的 Event 對象,并且把 copy 數組中對應的屬性從 native event 中復制到自己的 Event 對象中。

while ( i-- ) {
    prop = copy[ i ];
    event[ prop ] = originalEvent[ prop ];
}

在最后 jQuery 還不忘放一個鉤子,調用 fixHook.fitler 方法用以糾正一些特定的 event 屬性。例如 mouse event 中的 pageX,pageY,keyboard event中的 which,進一步修正事件對象屬性的兼容問題。

fixHook.filter? fixHook.filter( event, originalEvent ) : event

fixHook 就是在上一章,預處理的時候用到的,分解 type 存進去的,針對這個特性的單獨處理,最后返回這個“全新的”Event 對象。

總的來說 jQuery.event.fix 做的事情:

1.將原生的事件對象 event 修正為一個新的可寫 event 對象,并對該 event 的屬性以及方法統一接口
2.該方法在內部調用了 jQuery.Event(event) 構造函數

任務

?不會了怎么辦
||

提問題

寫筆記

公開筆記
提交
||

請驗證,完成請求

由于請求次數過多,請先驗證,完成再次請求

加群二維碼

打開微信掃碼自動綁定

您還未綁定服務號

綁定后可得到

  • · 粉絲專屬優惠福利
  • · 大咖直播交流干貨
  • · 課程更新,問題答復提醒
  • · 賬號支付安全提醒

收藏課程后,能更快找到我哦~

使用 Ctrl+D 可將課程添加到書簽

邀請您關注公眾號
關注后,及時獲悉本課程動態

舉報

0/150
提交
取消
全部 精華 我要發布
全部 我要發布
最熱 最新
只看我的

手記推薦

更多

本次提問將花費2個積分

你的積分不足,無法發表

為什么扣積分?

本次提問將花費2個積分

繼續發表請點擊 "確定"

為什么扣積分?