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