touch事件的简单封装
来源:互联网 发布:hex editor怎么修改mac 编辑:程序博客网 时间:2024/06/18 13:59
在Q群有很多人在问touch事件怎么去监控它的左右滑动,于是乎有时间我就萌生了封装touch对象的想法。
利用ES6的新特性class写的touch类,下面来详情介绍一下我的思路:利用ES6的新特性class写的touch类,下面来详情介绍一下我的思路:
下面这个object存放的是用于判断事件的各种参数,它在touchstart、touchmove、touchend的过程中绑定相关数据达到最终的判断结果,具体将过程在后面介绍。
this.obj = { x1: 0, // 初始横坐标 y1: 0, // 初始纵坐标 timeStart: 0, // 初始时间戳 x2: 0, // 结束横坐标 y2: 0, // 结束纵坐标 timeEnd: 0, // 结束时间戳 x: 50, // 横坐标的容错值 y: 50, // 纵坐标的容错值 interval: 200, // 有效时间间隔 sX: 0, // 存放横坐标差 sY: 0, // 存放纵坐标差 sTime: 0, // 存放touch事件的时间长度 getXandYandTime: function () { // 获取坐标差,和touch时间的长度 this.sX = this.x2 - this.x1 this.sY = this.y2 - this.y1 this.sTime = this.timeEnd - this.timeStart }, len: 0 // 记录多少个触摸点}
下面的object是一个事件委托的列表,每一种事件都用一个列表来存放,避免多次绑定造成的覆盖影响。
this.event = { touch: [], longTouch: [], leftMove: [], rightMove: [], topMove: [], bottomMove: []}
下面是核心代码,touch事件的判断逻辑。touchstart记录初始坐标值,touchmove跟踪最终坐标点,在touchend或touchcancel根据sX、sY、sTime等参数来判断是什么事件。
init() { this.elm.addEventListener('touchstart', event => { // 保证是单指点击事件 this.obj.len = event.touches.length if (this.obj.len === 1) { this.obj.x1 = this.obj.x2 = event.touches[0].pageX this.obj.y1 = this.obj.y2 = event.touches[0].pageY this.obj.timeStart = new Date().getTime() } }) this.elm.addEventListener('touchmove', (event) => { if (this.obj.len === 1){ this.obj.x2 = event.touches[0].pageX this.obj.y2 = event.touches[0].pageY } }) var touchend = (event) => { if (this.obj.len != 1) { return } let str = '' this.obj.timeEnd = new Date().getTime() this.obj.getXandYandTime() // 判断是否为点击事件 if (Math.abs(this.obj.sX) < this.obj.x && Math.abs(this.obj.sY) < this.obj.y){ if (this.obj.sTime < this.obj.interval) { // console.log('点击事件') str = 'touch' } else { // console.log('长按事件') str = 'longTouch' } } else { if (Math.abs(this.obj.sX) > Math.abs(this.obj.sY)) { if (this.obj.sX > 0) { // console.log('右滑事件') str = 'rightMove' } else { // console.log('左滑事件') str = 'leftMove' } } else { if (this.obj.sY > 0) { // console.log('下滑事件') str = 'bottomMove' } else { // console.log('上滑事件') str = 'topMove' } } } this.mapEvent(str, event) } this.elm.addEventListener('touchend', (event) => { touchend.call(this, event) }) this.elm.addEventListener('touchcancel', (event) => { touchend.call(this, event) })}
上面介绍了自定义touch事件的判断,接下来看看事件的绑定和解绑,从下面三个方法可以看出来,on将要绑定的事件委托压入数组,off将为委托清空,执行的时候讲列表的函数都执行一次,默认传入event参数。
// 绑定自定义事件on(str, fn) { this.event[str].push(fn) return this}// 解绑自定义事件off(str) { this.event[str] = [] return this}// 执行自定义事件mapEvent(str, event) { for(let val of this.event[str]){ val(event) }}
最后附上全部的代码:
class touch { constructor(elm) { this.elm = elm this.obj = { x1: 0, // 初始横坐标 y1: 0, // 初始纵坐标 timeStart: 0, // 初始时间戳 x2: 0, // 结束横坐标 y2: 0, // 结束纵坐标 timeEnd: 0, // 结束时间戳 x: 50, // 横坐标的容错值 y: 50, // 纵坐标的容错值 interval: 200, // 有效时间间隔 sX: 0, // 存放横坐标差 sY: 0, // 存放纵坐标差 sTime: 0, // 存放touch事件的时间长度 getXandYandTime: function () { console.log(this) this.sX = this.x2 - this.x1 this.sY = this.y2 - this.y1 this.sTime = this.timeEnd - this.timeStart }, len: 0 // 记录多少个触摸点 } // 事件代理列表 this.event = { touch: [], longTouch: [], leftMove: [], rightMove: [], topMove: [], bottomMove: [] } this.init() } // 初始化绑定touchstart、touchmove、touchend事件,用于判断用户执行的操作 init() { this.elm.addEventListener('touchstart', event => { // 保证是单指点击事件 this.obj.len = event.touches.length if (this.obj.len === 1) { this.obj.x1 = this.obj.x2 = event.touches[0].pageX this.obj.y1 = this.obj.y2 = event.touches[0].pageY this.obj.timeStart = new Date().getTime() } }) this.elm.addEventListener('touchmove', (event) => { if (this.obj.len === 1){ this.obj.x2 = event.touches[0].pageX this.obj.y2 = event.touches[0].pageY } }) var touchend = (event) => { if (this.obj.len != 1) { return } let str = '' this.obj.timeEnd = new Date().getTime() this.obj.getXandYandTime() // 判断是否为点击事件 if (Math.abs(this.obj.sX) < this.obj.x && Math.abs(this.obj.sY) < this.obj.y){ if (this.obj.sTime < this.obj.interval) { // console.log('点击事件') str = 'touch' } else { // console.log('长按事件') str = 'longTouch' } } else { if (Math.abs(this.obj.sX) > Math.abs(this.obj.sY)) { if (this.obj.sX > 0) { // console.log('右滑事件') str = 'rightMove' } else { // console.log('左滑事件') str = 'leftMove' } } else { if (this.obj.sY > 0) { // console.log('下滑事件') str = 'bottomMove' } else { // console.log('上滑事件') str = 'topMove' } } } this.mapEvent(str, event) } this.elm.addEventListener('touchend', (event) => { touchend.call(this, event) }) this.elm.addEventListener('touchcancel', (event) => { touchend.call(this, event) }) } // 绑定自定义事件 on(str, fn) { this.event[str].push(fn) return this } // 解绑自定义事件 off(str) { this.event[str] = [] return this } // 执行自定义事件 mapEvent(str, event) { for(let val of this.event[str]){ val(event) } }}
调用方式:
var t = new touch(document.getElementsByClassName('test')[0]).on('touch', event => { console.log('touch')}).on('leftMove', event => { console.log('leftMove')}).off('touch')
阅读全文
1 0
- touch事件的简单封装
- 对touch事件传递的简单理解
- UIWebView上Touch/UITapGestureRecognizer事件的最简单的方法
- Android的Touch事件分发的简单应用举例
- 自行封装移动端touch事件
- 简易封装移动端touch事件
- Android的Touch事件分发机制简单分析
- touch gesture 事件在移动端的简单实现
- Android的Touch事件分发机制简单探析
- UGUI点击事件的简单封装
- Cocos2d-js 触摸事件的简单封装
- View的touch事件
- android的touch事件
- ImageView的touch事件
- Touch事件的派发
- js的touch事件
- RecyclerView的touch事件
- UIScrollView的touch事件特点
- jQuery
- Spring之自动装配
- Exceptionin thread "main" java.lang.UnsatisfiedLinkError问题
- 算法基础——插入排序
- Servlet
- touch事件的简单封装
- mybatis配置文件
- TensorFlow学习笔记1
- Java+统计文件文章中单词的数量,去除指定特殊符号
- 捕捉全局异常简单篇
- android格式化通讯录
- 20170920前端第二天
- UVA 10077 The Stern-Brocot Number System
- Jzoj1322硬币