博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
读Zepto源码之Gesture模块
阅读量:6814 次
发布时间:2019-06-26

本文共 2023 字,大约阅读时间需要 6 分钟。

hot3.png

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

读 Zepto 源码系列文章已经放到了github上,欢迎star:

源码版本

本文阅读的源码为

GitBook

《》

整体结构

;(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 对象的作用差不多,可以先看看 《》对 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 清空。

系列文章

参考

License

最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:

作者:对角另一面

转载于:https://my.oschina.net/u/3483091/blog/1542659

你可能感兴趣的文章
格式化字符串
查看>>
Oracle通过SQL语句查看table所引用的对象(View/Function/Procedure/Trigger)
查看>>
jenkins权限配置不对导致jenkins无法登陆
查看>>
java 向上转型与向下转型
查看>>
4.11搭建网站的两个小问题
查看>>
Java知多少(44)异常类型
查看>>
什么是Servlet?它有哪些特点
查看>>
BZOJ 1497 [NOI2006]最大获利
查看>>
深入浅出KNN算法(二) sklearn KNN实践
查看>>
github上face_recognition工程项目实践
查看>>
Bzoj3992:[SDOI2015]序列统计
查看>>
ZJOI2018外省选手酱油记Day1
查看>>
如何用OpenCV自带的adaboost程序训练并检测目标
查看>>
SSM-MyBatis-08:Mybatis中SqlSession的commit方法为什么会造成事物的提交
查看>>
C++ 生成随机数
查看>>
poj1014
查看>>
poj3087
查看>>
mybatis generator
查看>>
[Selenium] close alert window
查看>>
远程调用appium server
查看>>