您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
检测扫码枪输入时的中文输入法和大写锁定状态,防止输入错误
// ==UserScript== // @name BarcodeScannerHelper4.0 // @namespace http://tampermonkey.net/ // @version 4.0.0 // @description 检测扫码枪输入时的中文输入法和大写锁定状态,防止输入错误 // @author mabaize // @match *https://decom.boost.aws.a2z.org.cn/decom/work-requests* // @match *https://mobility.aws-border.cn/* // @match *https://mobility.amazon.com/* // @match *https://issues.cn-northwest-1.amazonaws.cn/issues/* // @match *https://myday-website.zhy.aws-border.cn/dashboard/* // @match *https://myday-website.zhy.aws-border.cn/* // @match *https://t.zhy.aws-border.cn/* // @match *https://app.boost.aws.a2z.org.cn/* // @match *https://tavern.zhy.aws-border.cn/* // @match *https://aws.argo.ocean-wave.aws.a2z.com/townsend/* // @grant none // @run-at document-idle // ==/UserScript== (function() { 'use strict'; /** * 扫码枪输入检测脚本 - 轻量级版本 * 专门解决网页卡死问题 */ class BarcodeScannerHelperV3 { constructor() { this.isInputMethodWarningShown = false; this.isCapsLockWarningShown = false; this.lastInputTime = 0; this.scannerInputThreshold = 50; this.isComposing = false; this.warningCooldown = false; // 警告冷却时间 this.eventThrottle = false; // 事件节流 this.init(); } init() { // 使用更轻量的事件监听,避免捕获阶段 document.addEventListener('keydown', this.handleKeyDown.bind(this)); document.addEventListener('compositionstart', this.handleCompositionStart.bind(this)); document.addEventListener('compositionend', this.handleCompositionEnd.bind(this)); console.log('扫码枪输入检测脚本已启动 (轻量级版本 v3.0)'); } /** * 事件节流处理 */ throttleEvent(callback, delay = 100) { if (this.eventThrottle) return; this.eventThrottle = true; setTimeout(() => { this.eventThrottle = false; callback(); }, delay); } /** * 检测是否为扫码枪输入 */ isScannerInput() { const currentTime = Date.now(); const timeDiff = currentTime - this.lastInputTime; this.lastInputTime = currentTime; return timeDiff < this.scannerInputThreshold; } /** * 检测大写锁定状态 */ isCapsLockOn(event) { try { if (event.getModifierState) { return event.getModifierState('CapsLock'); } } catch (e) { console.warn('无法检测大写锁定状态:', e); } return false; } /** * 轻量级中文输入法检测 */ isChineseInputMethod(event) { // 简化检测逻辑,避免复杂判断 return this.isComposing || (event.isComposing === true) || (event.keyCode === 229); } /** * 检测是否为输入框元素 */ isInputElement(element) { if (!element) return false; const tagName = element.tagName.toLowerCase(); const inputTypes = ['text', 'password', 'search', 'url', 'email', 'tel']; return (tagName === 'input' && inputTypes.includes(element.type)) || tagName === 'textarea' || element.contentEditable === 'true'; } /** * 轻量级事件阻止 */ lightPreventEvent(event, reason) { // 只使用preventDefault,避免stopPropagation导致的问题 event.preventDefault(); console.log(`事件已阻止: ${event.type}, 原因: ${reason}`); return false; } /** * 显示警告弹窗 (简化版) */ showWarning(message, type) { // 防止重复弹窗和频繁弹窗 if (this.warningCooldown) return; if (type === 'inputMethod' && this.isInputMethodWarningShown) return; if (type === 'capsLock' && this.isCapsLockWarningShown) return; this.warningCooldown = true; // 使用更简单的弹窗,避免复杂DOM操作 const confirmed = confirm(`⚠️ 扫码枪输入错误\n\n${message}\n\n点击"确定"继续`); if (type === 'inputMethod') this.isInputMethodWarningShown = true; if (type === 'capsLock') this.isCapsLockWarningShown = true; // 设置冷却时间 setTimeout(() => { this.warningCooldown = false; if (type === 'inputMethod') this.isInputMethodWarningShown = false; if (type === 'capsLock') this.isCapsLockWarningShown = false; }, 2000); console.log('显示警告:', message); } /** * 处理键盘按下事件 (简化版) */ handleKeyDown(event) { // 事件节流,避免过度处理 if (this.eventThrottle) return; if (!this.isInputElement(event.target)) return; if (event.key === 'Enter') { // 检查大写锁定 if (this.isCapsLockOn(event)) { this.throttleEvent(() => { this.showWarning('检测到大写锁定已开启!\n请关闭大写锁定后重新扫码', 'capsLock'); }); return this.lightPreventEvent(event, '大写锁定开启'); } // 检查IME状态 if (this.isChineseInputMethod(event)) { this.throttleEvent(() => { this.showWarning('检测到中文输入法!\n请切换到英文输入法后重新扫码', 'inputMethod'); }); return this.lightPreventEvent(event, 'IME活跃状态'); } } // 检测扫码枪输入时的状态 if (this.isScannerInput()) { if (this.isCapsLockOn(event)) { this.throttleEvent(() => { this.showWarning('检测到大写锁定已开启!\n请关闭大写锁定后重新扫码', 'capsLock'); }, 200); } if (this.isChineseInputMethod(event)) { this.throttleEvent(() => { this.showWarning('检测到中文输入法!\n请切换到英文输入法后重新扫码', 'inputMethod'); }, 200); } } } /** * 处理输入法组合开始事件 (简化版) */ handleCompositionStart(event) { if (!this.isInputElement(event.target)) return; this.isComposing = true; console.log('IME组合开始'); // 延迟处理,避免阻塞 setTimeout(() => { if (event.target && event.target.value) { event.target.value = ''; } this.throttleEvent(() => { this.showWarning('检测到中文输入法!\n请切换到英文输入法后重新扫码', 'inputMethod'); }, 300); }, 10); } /** * 处理输入法组合结束事件 (简化版) */ handleCompositionEnd(event) { if (!this.isInputElement(event.target)) return; console.log('IME组合结束'); // 延迟处理,避免阻塞 setTimeout(() => { if (event.target && event.target.value) { event.target.value = ''; } this.isComposing = false; }, 50); } /** * 销毁监听器 */ destroy() { document.removeEventListener('keydown', this.handleKeyDown.bind(this)); document.removeEventListener('compositionstart', this.handleCompositionStart.bind(this)); document.removeEventListener('compositionend', this.handleCompositionEnd.bind(this)); console.log('扫码枪输入检测脚本已停止 (轻量级版本)'); } } // 等待DOM完全加载后初始化 function initializeScript() { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', function() { window.barcodeScannerHelperV3 = new BarcodeScannerHelperV3(); }); } else { window.barcodeScannerHelperV3 = new BarcodeScannerHelperV3(); } } // 立即初始化 initializeScript(); })();