亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Javascript前端UI框架Kit使用指南之kitjs事件管理

2019-11-20 13:51:21
字體:
來源:轉載
供稿:網友

從今天這章開始,我將會著重介紹KitJs的事件管理的內容,盡量用淺顯的語言給大家揭露主流的js框架是如何在內部實現自己獨立的事件管理功能的。

(一)普通的Dom事件

我們一般可以通過支持在HTML寫上事件

<a onclick=”alert(1)”>測試</a>

或者取到dom對象后綁定

document.getElementById(‘a').onclick=function(){alert(1)}

或者二級事件

document.getElementById(‘a').addEventListener(‘click',function(){alert(1)},flase)

或者通過script tag

<script for=”a” event=”onclick”>alert(1)</script>

而W3C標準推薦的是以上的第三種方式綁定,既二級事件的方式,目的是解耦HTML與Js的強依賴

(二)問題

但是如果我們僅僅直接使用方式3的方式進行我們的Js編程的話,還是不夠的,因為會遇到以下問題

1. 瀏覽器兼容性,IE系列和W3C支持的瀏覽器對于二級事件綁定的方式名,參數都不一致

2. 通過2級事件綁定之后,你無法知道別人對于同一個元素有沒有綁定過事件,綁定了哪些事件,事件內容是什么?

3. 通過2級事件綁定的方法觸發后,順序不是按照綁定之前的先后順序,是隨機執行的,可有些時候,我們需要對于觸發的方法按照順序

4. 當同一個元素的事件被觸發之后,沒有w3c的標準api支持對于同一個元素綁定著的其他事件停止繼續觸發,w3c支持停止冒泡

5. 很多時候,我們是通過匿名函數的方法注冊2級事件的,沒有留下注冊事件執行方法的句柄,所以很難通過removeEventListener注銷該事件

(三)Kit如何解決

ok,js框架就是為了解決以上問題而存在的,讓我們看看kit是如何處理以上問題的。

在kit.js的api中,存在一個ev(config)方法

該方法接受一個Map類型的object,里面存在了4個重要參數,

el 需要綁定的元素

String 事件類型

fn 觸發執行的方法

scope 可以省略,是否需要指定this指針,如無,則傳入注冊時的el作為this指針

(四)代碼解析

讓我們進一步看看代碼實現

直接從核心部分看起

如果傳入參數不為空,那個在傳入參數的el上建立一個對象,用于保存KitJs的事件注冊evReg

evReg對象里面有兩個子對象,一個叫做evRegEv,保存注冊的事件

在evRegEv對象里面,保存一個key為當前注冊事件,value為一個數組,數組里面按照先來后到的順序放入方法ev傳入的config參數,注意了,這個是一個數組?。?!因為數組可以保存先后順序,這一點非常重要

還有一個叫做evRegFn,保存事件觸發的匿名方法,

我們可以看到evRegFn是一個匿名事件,在開頭,他會判斷一下global的變量window[me.CONSTANTS.KIT_EVENT_STOPIMMEDIATEPROPAGATION]是否==true,如果是true的話,即會返回,不會再繼續執行

接著往下看,他會接受到事件觸發的EV對象,給這個EV用mergeIf的方式附加很多對象,像target,currentTarget,relatedTarget是為了解決瀏覽器兼容性的問題

而stopNow,stopDefault,stopGoOn是為了阻止事件繼續觸發而創建的方法。

下面這段就是evRegFn的關鍵了,我們會循環之前創建的那個evRegEv里面的事件數組,按照先后順序,取出之前的ev方法傳入的config參數,執行config參數里面方法,如果方法的返回值不為空,則返回他的返回值

最后做一個瀏覽器兼容,用2級事件的方式,綁定我們的evRegFn匿名方法。

(五)小結

簡單來說,Kit用一個自己的匿名方法,緩存了事件注冊的句柄,到一個數組里面,這樣就可以記住事件的先后順序,以及提供入口找出之前注冊的事件,參數,方法等等,同時針對瀏覽器兼容性做了兼容。

(六)注銷事件

有了Kit幫忙緩存事件句柄,注銷就變得簡單了

你可以看到Kit通過直接對比,或者fn.toString對比,以及fn.toString().trim()的方式對比來找到對應的事件config,從數組中刪除

(七)事件增強

大家剛才也應該留意到Kit對于系統的Event對象做了一個mergeIf的操作,首先為什么要做megerIf,因為系統的Event的對象屬性是Readonly的,不能覆蓋,只能添加他沒有的屬性

所以Kit只能megerIf,我們都知道各個瀏覽器的事件對象Event Object存在一個不兼容性,所以就需要Kit去fix這些不兼容,比如IE沒有target屬性,只有srcElement,我們可以給他加上target屬性,實現W3c標準的兼容

當然了,僅僅的修復是不能滿足我們的需求的,很多時候,我們還需要給Event對象做一點小小的增肥

比如在iphone的touchdown,touchmove開發的時候,我們經常要取到單指的offset,而取單指的offset,又需要ev.targetTouches[0].clientX,這樣的代碼,但是一旦在匿名函數這樣了,在PC上又不兼容了,

怎么辦呢,沒有關系,我們可以給Event Object mergeIf我們自己的屬性

firstFingerClientX等等,這樣我們就可以很簡單的實現移動端,PC端開發的代碼統一了。

包括,下一篇要說HTML5拖拽,高級手勢事件都是基于這一基礎之上架構的。

補充一下,為什么不像ExtJs那樣new一個自己的Event,是因為

1. 系統原生的對象,有一定的繼承關系,不想破壞

2. 如果用自己的new Object,可能會造成代碼脫離框架之后,不可移植性,需要再次改變代碼內容

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美黄网免费在线观看| 91午夜在线播放| 亚洲精品一区二区网址| 欧美激情精品久久久久久久变态| 色999日韩欧美国产| 深夜福利日韩在线看| 欧美成人免费在线观看| 欧美国产亚洲视频| 日韩欧美在线观看| 国产精品久久视频| 国产欧美 在线欧美| 尤物九九久久国产精品的特点| 日韩欧美精品网站| 欧美精品www在线观看| 亚洲精品ady| 色婷婷综合久久久久| 精品久久久精品| 国产精品香蕉在线观看| 久久成人亚洲精品| 亚洲欧洲在线看| 欧美色欧美亚洲高清在线视频| 亚洲成人精品av| 91精品在线看| 亚洲欧洲激情在线| 亚洲国产日韩一区| 中文国产亚洲喷潮| 深夜精品寂寞黄网站在线观看| 精品国产91久久久久久| 国产在线观看精品一区二区三区| 欧美国产在线视频| 久久久视频在线| 久久视频在线视频| 亚洲电影在线观看| 亚洲国产高清高潮精品美女| 亚洲欧美日韩国产精品| 国产成人aa精品一区在线播放| 久久久综合av| 最近免费中文字幕视频2019| 高清欧美一区二区三区| 日韩精品在线播放| 麻豆国产精品va在线观看不卡| 在线观看亚洲视频| 亚洲精品视频免费| 久久影院资源网| 国产精品成人国产乱一区| 日韩国产高清视频在线| 久久免费在线观看| 狠狠色狠狠色综合日日五| 欧美激情综合亚洲一二区| 亚洲少妇激情视频| 亚洲理论电影网| 色综合久久久久久中文网| 亚洲精品自产拍| 国产精品678| 欧美日韩免费观看中文| 精品一区二区三区三区| 国产精品av在线| 精品视频在线观看日韩| 国产精品18久久久久久麻辣| 国产精品日韩欧美综合| 亚洲精品视频免费| 久久久www成人免费精品张筱雨| 九九热r在线视频精品| 国产91网红主播在线观看| 久久久久久久影院| 久久久成人av| 久久久久久久av| 在线视频精品一| 国产视频精品va久久久久久| 亚洲一二三在线| 久久国产色av| 欧美激情a∨在线视频播放| 日本一本a高清免费不卡| 日韩在线国产精品| yw.139尤物在线精品视频| 日韩在线免费视频观看| 日韩av片免费在线观看| 97久久精品人搡人人玩| 亚洲精品综合精品自拍| 日韩国产精品视频| 久久久久女教师免费一区| 欧美日韩国产精品一区二区三区四区| 亚洲高清久久网| 国产亚洲精品va在线观看| 日韩视频中文字幕| 欧美大片va欧美在线播放| 亚洲高清在线观看| 亚洲在线免费看| 色哟哟亚洲精品一区二区| 亚洲中国色老太| 在线日韩第一页| 中文精品99久久国产香蕉| 日韩视频免费中文字幕| 久久久免费在线观看| 日韩有码在线视频| 亚洲欧美第一页| 国产亚洲视频在线| 精品国产精品三级精品av网址| 一区二区亚洲欧洲国产日韩| 国产精品视频区| 8050国产精品久久久久久| 精品国产鲁一鲁一区二区张丽| 亚洲精品日产aⅴ| 海角国产乱辈乱精品视频| 国产精品久久久久久久久久99| 国产精品三级久久久久久电影| 日韩精品中文字幕有码专区| 午夜精品福利视频| 这里只有精品视频在线| 色播久久人人爽人人爽人人片视av| 欧美亚洲国产另类| 久久综合久久美利坚合众国| 这里精品视频免费| 日韩中文字幕视频在线观看| 欧美一级电影在线| 超碰97人人做人人爱少妇| 亚洲国产精品成人精品| 欧美老女人性视频| 韩日欧美一区二区| 美日韩精品免费视频| 91精品久久久久久久久久久久久| 亚洲欧洲一区二区三区久久| 国产精品福利网| 国产精品情侣自拍| 日韩av片免费在线观看| 亚洲视频在线观看网站| 欧美孕妇与黑人孕交| 日韩av综合网| 欧美成人黑人xx视频免费观看| 91亚洲精品久久久| 日韩黄色高清视频| 国产精品亚洲第一区| 精品久久久一区| 亚洲精品456在线播放狼人| 亚洲免费伊人电影在线观看av| 亚洲国产精品久久久| 91欧美精品成人综合在线观看| 欧美性xxxx极品高清hd直播| 亚洲欧美国产精品专区久久| 亚洲天堂男人天堂| 欧美孕妇毛茸茸xxxx| 亚洲三级av在线| 538国产精品一区二区在线| 国产99久久精品一区二区永久免费| www日韩欧美| 久久久久北条麻妃免费看| 主播福利视频一区| 亚洲男人第一网站| 91欧美视频网站| 中文字幕久久久| 国产精品一区二区久久国产| 91精品国产自产在线老师啪| 日韩在线精品一区| 欧美精品少妇videofree| 国产精品夜色7777狼人| 国产91亚洲精品| 日韩中文字幕久久| 国产一区红桃视频| 欧美电影免费观看电视剧大全| 国产精品高潮呻吟久久av黑人| 国产ts一区二区| 亚洲va久久久噜噜噜久久天堂| 国产亚洲精品激情久久| 欧日韩不卡在线视频|