使用jQuery监听扫码枪输入并禁止手动输入的实现方法

@(知识点总结)[jquery|扫码抢]

基于jQuery的扫码枪监听。如果只是想实现监听获取条码扫码信息,可以直接拿来使用,如果有更多的条码判断处理逻辑需要自己扩展。

一、功能需求

使用扫码枪扫描条码,在一个web页面监听获取扫码枪的数据,并禁止用户进行手动的输入操作。

开始的想法非常简单,因为扫码枪就是模拟键盘的输入,当他用usb接口插入电脑的时候,就变成了一个外接的输入设备,用js监听就可以了。但是如何判断用户是否为手动输入就需要做一些处理了。

二、主要问题

1.如何判断是否手动输入

2.如何判断一个条码输入完成

三、解决方案

手动输入的解决办法就是:对比一个键从按下到抬起的时间间隔,以及两次按键的时间间隔。

因为扫码枪的输入速度非常的快,我测试的扫码枪输入的间隔大概在15-60毫秒,然后手动输入的100-200之间,除非刻意的想突破限制进行快速的输入。这个间隔值可以控制的很小,前提不要快过扫码抢的速度。

输入完成的判断:可以对输入框变化做一个监听,如果达到我们想要的位数,则提交服务器端进行处理;第二种是基于扫码枪,因为我使用的扫码枪可以配置扫码成功最后附加一个回车。所以根据回车的keycode就可以判断为输入已经结束,然后获取输入框的value,再进行后续的处理(提交服务器等)。

四、代码

时间间隔的判断,依赖于jQuery的三个事件:keydown,keypress,keyup;即键开始按下,已经按下,弹起这三个状态,keydown,就是在按键刚刚被按下,但键值还没有写入文本框,keypress已经按下并且值已经输入到文本框,keyup就是弹起了。

需要做判断的就是按键从按下到抬起的时间间隔,与两次keydown的时间间隔。

主要的手动输入判断代码。

var barcode = { listenerObj: null, oneKeyTime : '', /* 一次按键时间间隔 */ twoKeyTime : '', /* 两次按键时间间隔 */ keyDownTime: '', /* 键按下的时间 */ barcodeLen : 8 , /* 条形码长度 */ spanTime : 70, /* 一次按键按下到释放的时间间隔 */ on_key_down : function (){ var that = this; this.listenerObj.keydown(function(e){ if(e.which !== 13 && !(that.in_range(e.which))){ $(that.listenerObj).val(''); return ; } var d = new Date(); var curTime = parseInt(d.getTime()); if(that.keyDownTime !== '' && that.keyDownTime !== NaN){ that.twoKeyTime = curTime - that.keyDownTime; } that.keyDownTime = curTime; }); }, on_key_up : function(){ var that = this; this.listenerObj.keyup(function(e){ var d = new Date(); var keyUpTime = d.getTime(); that.oneKeyTime = parseInt(keyUpTime) - parseInt(that.keyDownTime); var isHand = that.checkHandInput(); if(isHand && that.in_range(e.which)){ layer.msg('禁止手动输入'); $(that.listenerObj).val(""); } }) }, on_key_press : function(){ var that = this; this.listenerObj.keypress(function(e){ if(e.which == 13 && that.check_barcode()){ that.createListEl(); } }); }, checkHandInput : function(){ if((this.oneKeyTime > this.spanTime) || this.twoKeyTime > this.spanTime){ return true; }else{ return false; } },}

将代码整理了一下,放到了Github。

我的js代码中的提示用到了layer.js,所以如果使用按照index.html中的示例,引入相关的js:

$("#barCode").startListen({ barcodeLen : 10, letter : true, number : true, show : function(code){ layer.msg(code); }});

运行效果图:

这里可配置的参数:包括条码的长度,是否包含英文字母,是否包含数字。以及一个show回调方法,这个方法会在扫码成功,条码合法的情况下被调用,返回条码的值,以便做自定义的操作,如上传服务器等。

代码中对页面的输入框做了stay focus,所以页面有其他的输入需求无法实现,可以除去keepFocusInput的调用。

代码很简单,可以直接阅读,有值得改进的地方欢迎指出。

@(知识点总结)[jquery|扫码抢]

基于jQuery的扫码枪监听。如果只是想实现监听获取条码扫码信息,可以直接拿来使用,如果有更多的条码判断处理逻辑需要自己扩展。

一、功能需求

使用扫码枪扫描条码,在一个web页面监听获取扫码枪的数据,并禁止用户进行手动的输入操作。

开始的想法非常简单,因为扫码枪就是模拟键盘的输入,当他用usb接口插入电脑的时候,就变成了一个外接的输入设备,用js监听就可以了。但是如何判断用户是否为手动输入就需要做一些处理了。

二、主要问题

1.如何判断是否手动输入

2.如何判断一个条码输入完成

三、解决方案

手动输入的解决办法就是:对比一个键从按下到抬起的时间间隔,以及两次按键的时间间隔。

因为扫码枪的输入速度非常的快,我测试的扫码枪输入的间隔大概在15-60毫秒,然后手动输入的100-200之间,除非刻意的想突破限制进行快速的输入。这个间隔值可以控制的很小,前提不要快过扫码抢的速度。

输入完成的判断:可以对输入框变化做一个监听,如果达到我们想要的位数,则提交服务器端进行处理;第二种是基于扫码枪,因为我使用的扫码枪可以配置扫码成功最后附加一个回车。所以根据回车的keycode就可以判断为输入已经结束,然后获取输入框的value,再进行后续的处理(提交服务器等)。

四、代码

时间间隔的判断,依赖于jQuery的三个事件:keydown,keypress,keyup;即键开始按下,已经按下,弹起这三个状态,keydown,就是在按键刚刚被按下,但键值还没有写入文本框,keypress已经按下并且值已经输入到文本框,keyup就是弹起了。

需要做判断的就是按键从按下到抬起的时间间隔,与两次keydown的时间间隔。

主要的手动输入判断代码。

var barcode = { listenerObj: null, oneKeyTime : '', /* 一次按键时间间隔 */ twoKeyTime : '', /* 两次按键时间间隔 */ keyDownTime: '', /* 键按下的时间 */ barcodeLen : 8 , /* 条形码长度 */ spanTime : 70, /* 一次按键按下到释放的时间间隔 */ on_key_down : function (){ var that = this; this.listenerObj.keydown(function(e){ if(e.which !== 13 && !(that.in_range(e.which))){ $(that.listenerObj).val(''); return ; } var d = new Date(); var curTime = parseInt(d.getTime()); if(that.keyDownTime !== '' && that.keyDownTime !== NaN){ that.twoKeyTime = curTime - that.keyDownTime; } that.keyDownTime = curTime; }); }, on_key_up : function(){ var that = this; this.listenerObj.keyup(function(e){ var d = new Date(); var keyUpTime = d.getTime(); that.oneKeyTime = parseInt(keyUpTime) - parseInt(that.keyDownTime); var isHand = that.checkHandInput(); if(isHand && that.in_range(e.which)){ layer.msg('禁止手动输入'); $(that.listenerObj).val(""); } }) }, on_key_press : function(){ var that = this; this.listenerObj.keypress(function(e){ if(e.which == 13 && that.check_barcode()){ that.createListEl(); } }); }, checkHandInput : function(){ if((this.oneKeyTime > this.spanTime) || this.twoKeyTime > this.spanTime){ return true; }else{ return false; } },}

将代码整理了一下,放到了Github。

我的js代码中的提示用到了layer.js,所以如果使用按照index.html中的示例,引入相关的js:

$("#barCode").startListen({ barcodeLen : 10, letter : true, number : true, show : function(code){ layer.msg(code); }});

运行效果图:

这里可配置的参数:包括条码的长度,是否包含英文字母,是否包含数字。以及一个show回调方法,这个方法会在扫码成功,条码合法的情况下被调用,返回条码的值,以便做自定义的操作,如上传服务器等。

代码中对页面的输入框做了stay focus,所以页面有其他的输入需求无法实现,可以除去keepFocusInput的调用。

代码很简单,可以直接阅读,有值得改进的地方欢迎指出。


相关文章

  • js自定义消息机制研究学习(二)--做一些改动,定制自己的消息机制
  • js自定义消息机制研究学习(二)--做一些改动,定制自己的消息机制 上一篇 js自定义消息机制研究学习(一) --看百度搜索输入提示 简单研究了一下百度首页的代码. 今天我来尝试修改一下代码,以使它更适合我们实际的研发情况. 首先,我们修改 ...查看


  • 西安工业大学计算机专业毕业论文
  • 本科毕业设计(论文) 题目:基于WEB的软件工程案例教学平台 ----交互演示子系统的设计 院 (系): 专 业: 班 级: 学 生: 学 号: 指导教师: 2016年06月 本科毕业设计(论文) 题目:基于WEB的软件工程案例教学平台 - ...查看


  • GB9242型消防广播主机说明书
  • GB9242系列消防广播主机 一 概述 1)GB9242系列消防广播主机是火灾或意外事故现场进行应急广播的主要设备,通过它可向现场人员通报事故情况,并有效指挥或引导现场人员疏散:非事故情况下也可通过外部输入音源信号(如CD/MP3播放机.调 ...查看


  • 公共广播系统设计方案
  • 公共广播系统方案设计说明 设计方案 目录 一. 项目概述 ........................................................................................... ...查看


  • 校园广播系统设计方案
  • 背景音乐与紧急广播系统 设 计 方 案 设计单位:盐城航京电教设备有限公司 目录 一.前言:................................................................ 3 二.系统设计. ...查看


  • 飞鱼星路由器设置教程
  • 分析飞鱼星路由器背面铭牌的含义 相信很多有过配置飞鱼星路由器经验的朋友都知道,飞鱼星路由器背面铭牌上的HV字样,可笔者问过很多同行,他们似乎都不知道这个HV代表什么,今天笔者同大家分享飞鱼星路由器背面铭牌的含义. 上图中共有信息如下:产品型 ...查看


  • 总局广播电视安全播出管理规定
  • <广播电视安全播出管理规定> 广播中心实施细则 (试行) 国家广播电影电视总局 二〇一〇年五月 目 录 第一章 总则 ....................................................... ...查看


  • XX小学校园广播及听力系统设计方案
  • (此文档为word 格式,下载后您可任意编辑修改!) XXX 小学校园广播及听力系统 设计方案 单位名称:XXX 目 录 第一部分 校园广播及听力系统工程报价表 ....................................... ...查看


  • 汕头广播电视发射台2011考题
  • 汕头广播电视发射台 基础 1. 广播电视技术维护总方针为:不间断.高质量.既经济,又安全. A .安全播出 B .不间断: C .高效节能 D .高质量 E .既经济: F .又安全 2. 法轮功不法分子破坏广播电视系统的直接技术手段:破坏 ...查看


热门内容