| 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 | |
| 		} | |
| 	} | |
| }
 |