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


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

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

    一、功能需求

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

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

    二、主要问题

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

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

    三、解决方案

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

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

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

    四、代码

    时间间隔的判断,依赖于jQuery的三个事件:keydownkeypress,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:

    
    <input id="barCode" value="" type="text" placeholder="stay focus" style="" name="">
    $("#barCode").startListen({
    	barcodeLen : 10,
    	letter : true,
    	number : true,
    	show : function(code){
    		layer.msg(code);
    	}
    });
    

    运行效果图:

    效果图

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

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

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

  • 相关阅读:
    1081. Rational Sum (20) -最大公约数
    在Debug模式下中断, 在Release模式下跳出当前函数的断言
    net-snmp配置文件详解
    net-snmp5.7.3移植到arm-linux平台
    NET-SNMP开发——日志输出
    SNMP常用数据操作
    40 网络相关函数(八)——live555源码阅读(四)网络
    39 网络相关函数(七)——live555源码阅读(四)网络
    38 网络相关函数(六)——live555源码阅读(四)网络
    37 网络相关函数(五)——live555源码阅读(四)网络
  • 原文地址:https://www.cnblogs.com/skyfynn/p/6589866.html
Copyright © 2020-2023  润新知