angularjs全局捕获扫描枪扫描事件

实现功能:无论当前光标在何处,只要启动扫描枪扫描后,立马使光标全局丢失并获取扫描值。

实现思路:

1、获取键盘输入事件,键盘输入间隔时间小于30毫秒则可以认定为扫描枪输入

2、封装angularjs 指令,嵌套该指令到全局模块中,只能引入一次

3、开始扫描时,将光标定位到指令内部的无用按钮上,立即光标丢失,解决光标在其他表单控件输入的问题。

4、扫描完成后,将扫描的值通过angularjs事件全局下发到所有子controller中

5、子controller设置当前模块的事件名,并监听该事件名

指令源码:

/**
 * 获取扫描设备的扫描事件处理
 * 
 * @author luoy
 * @date 2019/09/05
 */
ngApp.directive('angularScan', function() {
			return {
				restrict : "E",
				scope : {
					options : "="
				},
				link : function(scope, elm, attrs) {

					var options = scope.options;

					if (isUndefined(options)) {
						console.error("")
						return;
					}
					var keycode = "";
					var lastTime = null;
					var nextTime = null;
					var lastCode = null;
					var nextCode = null;
					var $btn = $('<button  id = "scanOptions"></button>');
					$(elm).append($btn);
					document.onkeydown = function(e) {
						// 兼容性处理
						if (window.event) {
							nextCode = e.keyCode
						} else if (e.which) {
							nextCode = e.which
						}
						// 获取当前时间
						nextTime = new Date().getTime();
						if (nextCode == 13 && keycode != ""
								&& nextTime - lastTime <= 30) {// 回车字符
							scope.$root.$broadcast(options.eventName, keycode);// 全局推送事件到指定的子controller
							keycode = "";
							lastCode = null;
							lastTime = null;

						} else {
							// 此处可以增加限制nextCode的种类例如数字
							if (lastCode == null && lastTime == null) {// 初始字母

								if (nextCode == 16) {
									return;
								}
								angular.element(document)
										.find("[id='scanOptions']")[0].focus();
								angular.element(document)
										.find("[id='scanOptions']")[0].blur();
								keycode = String.fromCharCode(nextCode);
							} else if (lastCode != null && lastTime != null
									&& nextTime - lastTime <= 30) {

								if (nextCode == 16) {
									return;
								}
								keycode += String.fromCharCode(nextCode);
							} else {// 手动输入
								keycode = "";
								lastCode = null;
								lastTime = null;
							}
							lastCode = nextCode;
							lastTime = nextTime;
						}
					}
				}

			}

			function isUndefined(exp) {
				if (typeof(exp) == "undefined") {
					return true;
				}
				return false;
			}

		});

 

调用步骤:

1、主模块html中引入指令(只需要全局引用一次):<angular-scan options="scanOptions"/>

2、主模块controller代码:$rootScope.scanOptions={}

3、其他controller中监听扫描事件:

//修改当前扫描事件监听的名称(angularEvent为自定义对象)

$rootScope.scanOptions.eventName = angularEvent.JOBCOSTING_AUDIT_SCAN_EVENT;

//监听扫描

$scope.$on(angularEvent.JOBCOSTING_AUDIT_SCAN_EVENT, function(event, value) { 

    console.log(value);//打印扫描值

});

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值