From 3d546ae8aaf092bab2394a3ff4a9beda1cda0af1 Mon Sep 17 00:00:00 2001 From: yandadaFreedom <525966780@qq.com> Date: Thu, 21 Dec 2023 20:58:59 +0800 Subject: [PATCH] feat: add event --- packages/webpack-plugin/lib/runtime/event.js | 80 ++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 packages/webpack-plugin/lib/runtime/event.js diff --git a/packages/webpack-plugin/lib/runtime/event.js b/packages/webpack-plugin/lib/runtime/event.js new file mode 100644 index 0000000000..3301ac82cb --- /dev/null +++ b/packages/webpack-plugin/lib/runtime/event.js @@ -0,0 +1,80 @@ +const mpxEvents = (layer, options) => { + options = options || {} + + this.targetElement = null + + this.touchStartX = 0 + + this.touchStartY = 0 + + this.startTimer = null + + this.touchBoundary = options.touchBoundary || 10 + + this.sendEvent = (targetElement, type) => { + if (document.activeElement && document.activeElement !== targetElement) { + document.activeElement.blur() + } + const clickEvent = new TouchEvent(type, { + view: window, + bubbles: true, + cancelable: true + }) + targetElement.dispatchEvent(clickEvent) + } + + this.onTouchStart = (event) => { + if (event.targetTouches?.length > 1) { + return true + } + + const touch = event.targetTouches[0] + this.targetElement = event.target + + this.touchStartX = touch.pageX + this.touchStartY = touch.pageY + this.startTimer = setTimeout(() => { + this.sendEvent(this.targetElement, 'longpress') + this.sendEvent(this.targetElement, 'longtap') + }, 350) + return true + } + + this.touchHasMoved = (event) => { + const touch = event.changedTouches[0] + const boundary = this.touchBoundary + if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) { + this.startTimer && clearTimeout(this.startTimer) + this.startTimer = null + return true + } + return false + } + + this.onTouchMove = (event) => { + if (this.targetElement !== event.target || this.touchHasMoved(event)) { + this.targetElement = null + } + return true + } + + this.onTouchEnd = (event) => { + const targetElement = this.targetElement + this.startTimer && clearTimeout(this.startTimer) + this.startTimer = null + event.preventDefault() + this.sendEvent(targetElement, 'tap') + return false + } + + layer.addEventListener('touchstart', this.onTouchStart, false) + layer.addEventListener('touchmove', this.onTouchMove, false) + layer.addEventListener('touchend', this.onTouchEnd, false) + layer.addEventListener('contextmenu', (e) => { + e.preventDefault() + }) +} + +document.addEventListener('DOMContentLoaded', () => { + mpxEvents(document.getElementsByTagName('body')[0]) +}, false)