当前位置: 首页 > news >正文

扫码枪写入案例。关于js原生聚焦以及扫码枪原理

扫码枪原理:

扫码枪的原理是在当前页面聚焦的元素上,通过调用键盘按键快速输入信息并且触发回车按钮。因此可以通过监听keydown事件,判断是否按下Enter来处理数据。代码示例:

const handleScan = e => { const now = Date.now(); const key = e.key; if (key === 'Enter') { // 如果临时字符不为空,说明扫码完成 if (tempCode) { dataForm.value.sku_no = tempCode; // 回显结果 console.log('最终输入:', dataForm.value.sku_no); // 此处处理扫码枪扫码后逻辑 tempCode = ''; // 清空临时存储 } // 清除超时定时器(避免重复触发) clearTimeout(scanTimeout); return; } // 2. 过滤⽆效键(如 Shift、Ctrl 等功能键) if (key.length > 1) { return; } // 3. 通过时间间隔判断是否为扫码枪输⼊(扫码速度远快于⼿动输⼊) // ⼿动输⼊间隔通常 > 300ms,扫码枪通常 < 100ms if (now - lastKeyTime > 500) { // 间隔过⻓,视为新的扫码开始,清空临时字符 tempCode = ''; } // 4. 存储当前字符 tempCode += key; // 更新上⼀次按键时间 lastKeyTime = now; // 5. 重置超时定时器(如果 300ms 内没有新字符,视为扫码中断) clearTimeout(scanTimeout); scanTimeout = setTimeout(() => { tempCode = ''; // 超时后清空临时字符 }, 500); }; document.addEventListener('keydown', handleScan);

聚焦问题:

实际场景式在打开一个弹窗上,直接通过扫二维码然后调用接口给表格添加一行数据。但是测试发现只有在单击页面之后才能写入成功。监听元素为document无focus()可调用。通过以下示例触发页面焦点:

// 2. 设置焦点到可接收键盘输入的元素 const focusInput = () => { // 尝试找到一个可聚焦元素(input或设置tabindex的div) const focusableElement = document.querySelector('input, [tabindex]'); if (focusableElement) { focusableElement.focus(); } else { // 如果没有可聚焦元素,创建一个透明的输入框 const hiddenInput = document.createElement('input'); hiddenInput.style.position = 'fixed'; hiddenInput.style.opacity = 0; hiddenInput.style.pointerEvents = 'none'; document.body.appendChild(hiddenInput); hiddenInput.focus(); // 在失去焦点时移除 hiddenInput.addEventListener('blur', () => { document.body.removeChild(hiddenInput); }); } }; setTimeout(focusInput, 100);

focus()方法获得焦点的元素主要分为两类:原生可聚焦元素(表单组件)通过tabindex属性变为可聚焦的元素(任何 HTML 元素添加tabindex属性后均可获得焦点document.querySelector('[tabindex]');获取到可聚焦且无输入框的元素,如果有输入框会被输入事件拦截keydown事件,导致keydown监听不到。完成上诉之后即可实现完美扫码枪功能

http://www.jsqmd.com/news/447202/

相关文章:

  • 中医药方剂大模型开发方案
  • Qt/C++运行报错:exited with code -1073741819
  • iOS分页标签栏终极性能优化:快速解决XLPagerTabStrip滚动卡顿问题
  • 基于新型群智能优化算法的BP神经网络初始权值与偏置优化
  • 科研智能体平台设计与实现:社科类研究支持系统
  • RT-Thread ESP-Hosted
  • durable_rules模式匹配技术:DFA编译如何实现纳秒级字符串处理
  • local-web-server性能优化指南:让你的开发服务器飞起来
  • Flutter响应式管理面板AI功能集成:智能分析与自动化操作终极指南
  • 生产车间班组长绩效考核方案优化与绩效提升策略
  • 记录踩过的坑-金蝶云·苍穹平台-页面开发
  • 自平衡摩托车控制系统设计:Python实现方案
  • Ease高级特性:动态更新targetValue实现实时动画轨迹调整
  • 如何用Jspreadsheet CE快速创建动态数据表格:从数组到JSON的实战指南
  • REINFORCE、Remax、GRPO、DR.GRPO、DAPO、REINFORCE++、GPG、OPO、GSPO、SAPO、CLIP-COV、VC-PPO、VAPO对比
  • 微信小程序单元测试与集成测试完整指南:从入门到实战
  • (算法题)N个数求和
  • Flutter响应式管理面板终极容器化部署指南:Docker与Kubernetes实践
  • Clojure-lsp完全指南:从安装到精通的10个核心步骤
  • 终极指南:5个BackstopJS测试报告定制技巧与品牌化实战
  • IDEA与Gradle构建冲突,导致java重复类的解决方案
  • 大型项目测试策略:BackstopJS 场景分组与模块化配置管理终极指南
  • BackstopJS 测试数据隐私保护终极指南:敏感信息屏蔽与测试环境隔离技巧
  • 揭秘Rust Search Extension工作原理:从输入到结果的毫秒级响应
  • 如何高效调试与监控DeepSearcher:日志系统完全指南
  • DeepSearcher+Ollama:本地部署大模型的终极推理方案
  • ntlm_theft源代码解析:Python实现哈希窃取文件生成的核心原理
  • 微信小程序开发完整指南:从组件到云开发的实战教程
  • Crabviz支持哪些编程语言?一文了解LSP驱动的跨语言调用图生成能力
  • Opa vs 传统Web开发:为什么选择函数式语言构建前端应用?