最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Zepto源码中Gesture模块介绍

来源:懂视网 责编:小采 时间:2020-11-27 20:12:44
文档

Zepto源码中Gesture模块介绍

Zepto源码中Gesture模块介绍:Gesture 模块基于 IOS 上的 Gesture 事件的封装,利用 scale 属性,封装出 pinch 系列事件。源码版本本文阅读的源码为 zepto1.2.0GitBook《reading-zepto》整体结构;(function($){ if ($.os.ios) { var gesture = {},
推荐度:
导读Zepto源码中Gesture模块介绍:Gesture 模块基于 IOS 上的 Gesture 事件的封装,利用 scale 属性,封装出 pinch 系列事件。源码版本本文阅读的源码为 zepto1.2.0GitBook《reading-zepto》整体结构;(function($){ if ($.os.ios) { var gesture = {},

Gesture 模块基于 IOS 上的 Gesture 事件的封装,利用 scale 属性,封装出 pinch 系列事件。

源码版本

本文阅读的源码为 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 来进行设备侦测,里面是一大堆正则表达式,所以这个模块后面是不打算分析的了。

然后是监测 gesturestartgesturechangegestureend 事件,根据这三个事件,可以组合出 pinchpinchInpinchOut 事件。其实就是缩小和放大的手势操作。

其中变量 gesture 对象和 Touch 模块中的 touch 对象的作用差不多,可以先看看 《读Zepto源码之Touch模块》对 Touch 模块的分析。

parentIfText

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

这个辅助方法是获取目标节点,如果节点不是元素节点,则用父节点作为目标节点。如果事件在文本节点或者伪类元素上触发时,会出现不是元素节点的情况。

事件

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 的情况吧?),在起点的缩放值和终点的缩放值不相同的情况下,触发 pinch 事件;如果起点的缩放值比终点的缩放值大,则继续触发 pinchIn 事件,则缩小效果;如果起点的缩放值比终点的缩放值小,则继续触发 pinchOut 事件,即放大效果。

最终将 e1e2last 都设置为 0

last 不存在的情况下(在调用 preventDefault 时),将 gesture 清空。

文档

Zepto源码中Gesture模块介绍

Zepto源码中Gesture模块介绍:Gesture 模块基于 IOS 上的 Gesture 事件的封装,利用 scale 属性,封装出 pinch 系列事件。源码版本本文阅读的源码为 zepto1.2.0GitBook《reading-zepto》整体结构;(function($){ if ($.os.ios) { var gesture = {},
推荐度:
标签: 模块 zep zepto
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top