在使用uniapp开发收银机等设备时,常常会用到使用键盘输入的外设,如使用扫码器/扫码枪读取条形码/二维码等,及使用读卡器读取卡ID(需要读卡器支持键盘输入卡ID,此种方式只支持读取未加密的卡ID信息,读取加密信息请使用NFC方式)。
读取外设键盘输入会有两种情况,一种是外设在输入信息后会有一个Enter键输入作为结束,另一种则不会有,所以针对这部分会有两种处理方式,下文会做区分。
在uniapp项目根目录下的package.json文件中引入uniapp-keyboard-listener包,没有该文件则创建,package.json文件内容如下:
{
"dependencies": {
"uniapp-keyboard-listener": "^1.0.3"
}
}
在onLoad周期中注册键盘输入监听:
// #ifdef APP-PLUS
plus.key.addEventListener('keyup', function(KeyEvent) {
console.log("监听键按下事件:", KeyEvent.keyCode, KeyEvent.keyValue);
this.scan(KeyEvent) // 处理键码键值对应关系
});
// #endif
code: '',
codeArr: '',
timing_open: null, // 无Enter输入情况下需要使用
keyCode: {
7: 0,
8: 1,
9: 2,
10: 3,
11: 4,
12: 5,
13: 6,
14: 7,
15: 8,
16: 9,
},
以下代码中,Enter键键码为66(可视情况修改),所以在读取到键码为66时就表示获取到了完整的卡号,可用于处理后续。
scan(e) {
let _this = this
if (e.keyCode === 66) { // enter键
_this.code = _this.codeArr.join("")
console.log("-=-=-=卡号-=-=-", _this.codeArr, _this.code);
_this.codeArr = []
// 其他操作
} else {
_this.codeArr.push(_this.keyCode[e.keyCode])
}
}
无enter输入的方式处理起来会麻烦一点点,需要多预定义一个变量timing_open用于处理setTimeout。此处setTimeout的作用是用于键盘输入中断时读取完整的输入,一般键盘输入会有一个时间间隔,我这里是100毫秒,可以视实际情况进行调整。
scan (e){
let _this = this
clearTimeout(_this.timing_open)
_this.codeArr.push(_this.keyCode[e.keyCode])
_this.timing_open = setTimeout(function () {
_this.code = _this.codeArr.join("")
console.log("-=-=-=卡号-=-=-", _this.codeArr, _this.code);
_this.codeArr = []
// 其他操作
}, 100)
}
安卓键盘输入(本文使用的):Android KEYCODE键值对应大全-CSDN博客
标准键盘输入:键盘键码keyCode对照表-CSDN博客