讀Zepto源碼之Gesture模塊

Gesture 模塊基于 IOS 上的 Gesture 事件的封裝,利用 scale 屬性,封裝出 pinch 系列事件士八。

讀 Zepto 源碼系列文章已經放到了github上,歡迎star: reading-zepto

源碼版本

本文閱讀的源碼為 zepto1.2.0

GitBook

reading-zepto

整體結構

;(function($){
  if ($.os.ios) {
    var gesture = {}, gestureTimeout

    $(document).bind('gesturestart', function(e){
     ...
    }).bind('gesturechange', function(e){
      ...
    }).bind('gestureend', function(e){
     ...
    })

    ;['pinch', 'pinchIn', 'pinchOut'].forEach(function(m){
      $.fn[m] = function(callback){ return this.bind(m, callback) }
    })
  }
})(Zepto)

注意這里有個判斷 $.os.ios ,用來判斷是否為 ios 缨伊。這個判斷需要引入設備偵測模塊 Detect 摘刑。這個模塊利用 userAgent 來進行設備偵測,里面是一大堆正則表達式刻坊,所以這個模塊后面是不打算分析的了枷恕。

然后是監(jiān)測 gesturestartgesturechange谭胚、 gestureend 事件徐块,根據這三個事件,可以組合出 pinch 灾而、pinchInpinchOut 事件胡控。其實就是縮小和放大的手勢操作。

其中變量 gesture 對象和 Touch 模塊中的 touch 對象的作用差不多旁趟,可以先看看 《讀Zepto源碼之Touch模塊》對 Touch 模塊的分析昼激。

parentIfText

function parentIfText(node){
  return 'tagName' in node ? node : node.parentNode
}

這個輔助方法是獲取目標節(jié)點,如果節(jié)點不是元素節(jié)點锡搜,則用父節(jié)點作為目標節(jié)點橙困。如果事件在文本節(jié)點或者偽類元素上觸發(fā)時,會出現不是元素節(jié)點的情況耕餐。

事件

gesturestart

bind('gesturestart', function(e){
  var now = Date.now(), delta = now - (gesture.last || now)
  gesture.target = parentIfText(e.target)
  gestureTimeout && clearTimeout(gestureTimeout)
  gesture.e1 = e.scale
  gesture.last = now
})

Touch 模塊一樣凡傅,在 gesturestart 時,也用 delta 來記錄兩次 start 之間的時間間隔肠缔,用 gesture.target 來保存目標元素夏跷,e1 是起點時的縮放值。

gesturechange

bind('gesturechange', function(e){
  gesture.e2 = e.scale
})

gesturechange 時桩砰,更新終點 guesture.e2 的縮放值拓春。

gestureend

if (gesture.e2 > 0) {
  Math.abs(gesture.e1 - gesture.e2) != 0 && $(gesture.target).trigger('pinch') &&
    $(gesture.target).trigger('pinch' + (gesture.e1 - gesture.e2 > 0 ? 'In' : 'Out'))
  gesture.e1 = gesture.e2 = gesture.last = 0
} else if ('last' in gesture) {
  gesture = {}
}

如果 gesture.e2 存在(不可能有小于 0 的情況吧?)亚隅,在起點的縮放值和終點的縮放值不相同的情況下硼莽,觸發(fā) pinch 事件;如果起點的縮放值比終點的縮放值大煮纵,則繼續(xù)觸發(fā) pinchIn 事件懂鸵,則縮小效果;如果起點的縮放值比終點的縮放值小行疏,則繼續(xù)觸發(fā) pinchOut 事件匆光,即放大效果。

最終將 e1 酿联、 e2last 都設置為 0 终息。

last 不存在的情況下(在調用 preventDefault 時)夺巩,將 gesture 清空。

系列文章

  1. 讀Zepto源碼之代碼結構
  2. 讀Zepto源碼之內部方法
  3. 讀Zepto源碼之工具函數
  4. 讀Zepto源碼之神奇的$
  5. 讀Zepto源碼之集合操作
  6. 讀Zepto源碼之集合元素查找
  7. 讀Zepto源碼之操作DOM
  8. 讀Zepto源碼之樣式操作
  9. 讀Zepto源碼之屬性操作
  10. 讀Zepto源碼之Event模塊
  11. 讀Zepto源碼之IE模塊
  12. 讀Zepto源碼之Callbacks模塊
  13. 讀Zepto源碼之Deferred模塊
  14. 讀Zepto源碼之Ajax模塊
  15. 讀Zepto源碼之Assets模塊
  16. 讀Zepto源碼之Selector模塊
  17. 讀Zepto源碼之Touch模塊

參考

License

署名-非商業(yè)性使用-禁止演繹 4.0 國際 (CC BY-NC-ND 4.0)

最后周崭,所有文章都會同步發(fā)送到微信公眾號上柳譬,歡迎關注,歡迎提意見:

作者:對角另一面

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市续镇,隨后出現的幾起案子美澳,更是在濱河造成了極大的恐慌,老刑警劉巖摸航,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件制跟,死亡現場離奇詭異,居然都是意外死亡酱虎,警方通過查閱死者的電腦和手機雨膨,發(fā)現死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逢净,“玉大人哥放,你說我怎么就攤上這事〉粒” “怎么了甥雕?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胀茵。 經常有香客問我社露,道長,這世上最難降的妖魔是什么琼娘? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任峭弟,我火速辦了婚禮,結果婚禮上脱拼,老公的妹妹穿的比我還像新娘瞒瘸。我一直安慰自己,他們只是感情好熄浓,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布情臭。 她就那樣靜靜地躺著,像睡著了一般赌蔑。 火紅的嫁衣襯著肌膚如雪俯在。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天娃惯,我揣著相機與錄音跷乐,去河邊找鬼。 笑死趾浅,一個胖子當著我的面吹牛愕提,可吹牛的內容都是我干的馒稍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼揪荣,長吁一口氣:“原來是場噩夢啊……” “哼筷黔!你這毒婦竟也來了?” 一聲冷哼從身側響起仗颈,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎椎例,沒想到半個月后挨决,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡订歪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年脖祈,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刷晋。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡盖高,死狀恐怖,靈堂內的尸體忽然破棺而出眼虱,到底是詐尸還是另有隱情喻奥,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布捏悬,位于F島的核電站撞蚕,受9級特大地震影響,放射性物質發(fā)生泄漏过牙。R本人自食惡果不足惜甥厦,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寇钉。 院中可真熱鬧刀疙,春花似錦、人聲如沸扫倡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镊辕。三九已至油够,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間征懈,已是汗流浹背石咬。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卖哎,地道東北人鬼悠。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓删性,卻偏偏與公主長得像,于是被迫代替她去往敵國和親焕窝。 傳聞我的和親對象是個殘疾皇子蹬挺,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內容

  • Zepto 的 Data 模塊用來獲取 DOM 節(jié)點中的 data-* 屬性的數據,和儲存跟 DOM 相關的數據它掂。...
    對角另一面閱讀 593評論 0 1
  • Form 模塊處理的是表單提交巴帮。表單提交包含兩部分,一部分是格式化表單數據虐秋,另一部分是觸發(fā) submit 事件榕茧,提...
    對角另一面閱讀 535評論 0 0
  • Ajax 模塊也是經常會用到的模塊,Ajax 模塊中包含了 jsonp 的現實客给,和 XMLHttpRequest ...
    對角另一面閱讀 609評論 0 1
  • 古爾邦節(jié)新疆人特有的節(jié)日用押,連續(xù)放假五天。相當于一個小長假了靶剑,所以有假期的人都是歡呼雀躍的蜻拨! 家附近有片花海,...
    蜜甜水淡閱讀 213評論 0 1
  • 這幾天的反思花去大量時間和精力桩引,真是盡自己所能缎讼,渴望思考的有點質量,也能寫的好一點阐污⌒莸樱可我知道,其實還差的...
    暖暖的大樹閱讀 415評論 3 1