摘要:一功能需求使用扫码枪扫描条码,在一个页面监听获取扫码枪的数据,并禁止用户进行手动的输入操作。因为扫码枪的输入速度非常的快,我测试的扫码枪输入的间隔大概在毫秒,然后手动输入的之间,除非刻意的想突破限制进行快速的输入。
基于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的调用。
代码很简单,可以直接阅读,有值得改进的地方欢迎指出。
推荐一款适合二次开发的扫描枪:MS3398迷你条码扫描枪
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/50953.html
摘要:一功能需求使用扫码枪扫描条码,在一个页面监听获取扫码枪的数据,并禁止用户进行手动的输入操作。因为扫码枪的输入速度非常的快,我测试的扫码枪输入的间隔大概在毫秒,然后手动输入的之间,除非刻意的想突破限制进行快速的输入。 基于jQuery的扫码枪监听。如果只是想实现监听获取条码扫码信息,可以直接拿来使用,如果有更多的条码判断处理逻辑需要自己扩展。一、功能需求 使用扫码枪扫描条码,在一个web...
摘要:一功能需求使用扫码枪扫描条码,在一个页面监听获取扫码枪的数据,并禁止用户进行手动的输入操作。因为扫码枪的输入速度非常的快,我测试的扫码枪输入的间隔大概在毫秒,然后手动输入的之间,除非刻意的想突破限制进行快速的输入。 基于jQuery的扫码枪监听。如果只是想实现监听获取条码扫码信息,可以直接拿来使用,如果有更多的条码判断处理逻辑需要自己扩展。一、功能需求 使用扫码枪扫描条码,在一个web...
摘要:一开始的时候,定义焦点在文本框,当文本框失去焦点的时候重新定焦在文本框。这样,就无法判断,焦点是否在文本框。于是我想到了用定时器来做,代码如下定时器每隔检查一次,当发现焦点不在文本框里,则定焦到最初的文本框,否则不改变焦点。 没耐心的朋友,可以直接看代码。 最近在做一个关于收银台的项目,其中有一个需求,是扫码枪扫描支付码进行支付。扫码枪触发的事件,其实是一个keyup enter事件,...
阅读 1533·2021-11-25 09:43
阅读 2303·2019-08-30 15:55
阅读 1445·2019-08-30 13:08
阅读 2619·2019-08-29 10:59
阅读 792·2019-08-29 10:54
阅读 1374·2019-08-26 18:26
阅读 2493·2019-08-26 13:44
阅读 2627·2019-08-23 18:36