|
|
- const threshold = 50
- export default {
- props: {
- //点击事件位置设置
- clickOption: {
- type: Object,
- default () {
- return {
- width: uni.upx2px(200),
- height: uni.upx2px(200),
- left: 'auto',
- top: 'auto'
- }
- }
- }
- },
- computed: {
- //点击区域左边位置
- clickLeft () {
- return typeof this.clickOption.left == 'number' ? this.clickOption.left : (this.windowWidth / 2) - (this.clickOption.width / 2)
- },
- //点击区域右边位置
- clickRight () {
- return this.clickLeft + this.clickOption.width
- },
- //点击区域顶部位置
- clickTop () {
- return typeof this.clickOption.top == 'number' ? this.clickOption.top : (this.windowHeight / 2) - (this.clickOption.height / 2)
- },
- //点击区域底部位置
- clickBottom () {
- return this.clickTop + this.clickOption.height
- }
- },
- data () {
- return {
- autoplaySync: false,
- windowHeight: 0,//组件高度
- windowWidth: 0,//组件宽度
- clickTime: 0,//点击次数
- touchstartX: 0,//触摸开始x轴位置
- touchstartY: 0,//触摸开始y轴位置
- touchmoveX: 0,//触摸滑动x轴距离
- touchmoveY: 0,//触摸滑动y轴距离
- touchTime: 0//触摸时间
- }
- },
- methods: {
- touchstart (e) {
- if ( this.pageType != 'scroll' ) this.autoplaySync = false//如果是翻页阅读关闭自动播放
- if ( this.touchTimer ) {//清楚定时任务
- clearTimeout(this.touchTimer)
- this.touchTimer = null
- }
- if ( this.longTimer ) {//清楚定时任务
- clearTimeout(this.longTimer)
- this.longTimer = null
- }
- const touch = e.touches[0]
- this.touchstartX = touch.pageX
- this.touchstartY = touch.pageY
- //点击在规定区域中
- if ( this.touchstartX >= this.clickLeft && this.touchstartX <= this.clickRight && this.touchstartY >= this.clickTop && this.touchstartY <= this.clickBottom) {
- this.clickTime++
- if ( this.clickTime == 1 ) {//第一次点击
- this.touchTimer = setTimeout(() => {
- this.touchTime = 300
- }, 300)
- this.longTimer = setTimeout(() => {
- this.touchTime = 500
- if ( this.touchmoveX <= threshold && this.touchmoveY <= threshold ) this.$emit('long-click')//抛出长按事件
- this.resetTouch()
- }, 500)
- }
- } else {//没有点击在规定区域中直接重置触摸事件
- this.resetTouch()
- }
- },
- touchmove (e) {
- if ( this.clickTime > 0 ) {
- const touch = e.touches[0]
- this.touchmoveX = Math.abs(touch.pageX - this.touchstartX)
- this.touchmoveY = Math.abs(touch.pageY - this.touchstartY)
- }
- },
- touchend (e) {
- if ( this.pageType != 'scroll' ) this.autoplaySync = this.autoplay//如果是横向翻页开启自动播放
- if ( this.touchTimer ) {//清楚按下定时任务
- clearTimeout(this.touchTimer);
- this.touchTimer = null
- }
- if ( this.longTimer ) {//清楚长按定时任务
- clearTimeout(this.longTimer)
- this.longTimer = null
- }
- //点击次数为零或者触摸时间超过300,或者滑动距离超过阙值
- if ( this.clickTime == 0 || this.touchTime > 300 || this.touchmoveX > threshold || this.touchmoveY > threshold ) {
- this.resetTouch()
- return
- }
- if ( this.clickTime == 1 ) {//第一次点击
- this.touchTimer = setTimeout(() => {
- this.$emit('single-click')//抛出单击事件
- this.resetTouch()
- }, 300)
- }
- if ( this.clickTime == 2 ) {//第二次点击
- this.$emit('double-click')//抛出双击事件
- this.resetTouch()
- }
- },
- resetTouch () {
- this.touchstartX = 0
- this.touchstartY = 0
- this.touchmoveX = 0
- this.touchmoveY = 0
- this.touchTime = 0
- this.clickTime = 0
- }
- }
- }
|