// utils/GlobalInactivityManager.js export class GlobalInactivityManager { constructor(callback, timeout = 60000) { this.callback = callback this.timeout = timeout this.timer = null this.isPaused = false this.lastActivityTime = 0 this.THROTTLE_DELAY = 300 this.lowFreqEvents = ['mousedown', 'click', 'keydown', 'touchstart'] this.highFreqEvents = ['mousemove', 'scroll', 'wheel', 'pointermove'] } resetTimer = () => { if (this.isPaused) return if (this.timer) clearTimeout(this.timer) this.timer = setTimeout(() => { this.callback() this.pause() }, this.timeout) } handleUserActivity = () => { const now = Date.now() if (now - this.lastActivityTime > this.THROTTLE_DELAY) { this.lastActivityTime = now this.resetTimer() } } handleVisibilityChange = () => { if (document.hidden) { this.pause() } else { this.resume() } } start() { if (this.isPaused) return this.resetTimer() this.lowFreqEvents.forEach(event => { document.addEventListener(event, this.resetTimer, true) }) this.highFreqEvents.forEach(event => { document.addEventListener(event, this.handleUserActivity, true) }) document.addEventListener('visibilitychange', this.handleVisibilityChange) } pause() { this.isPaused = true if (this.timer) clearTimeout(this.timer) this.lowFreqEvents.forEach(event => { document.removeEventListener(event, this.resetTimer, true) }) this.highFreqEvents.forEach(event => { document.removeEventListener(event, this.handleUserActivity, true) }) document.removeEventListener('visibilitychange', this.handleVisibilityChange) } resume() { this.isPaused = false this.start() // 现在 this 指向正确,事件能正常绑定和触发 } destroy() { this.pause() this.callback = null } }