js web端扫码枪对接

假设 二维码地址为:https://www.xxx.com?id=SYM123456789

如下是扫码枪扫码后的效果:

需求:同一个二维码

1.通过微信扫码后进入H5页面;

2.web端使用扫码枪扫码后 我们只需要后12位(SYM123456789),并且这12位也可以通过手动输入;

怎么做呢?

第二个问题,如果不做任何处理的话,输入框聚焦后通过扫码枪扫码后的数据肯定是 

和我们的预期效果不一致 我只需要后12位 SYM123456789

这里是我自己想到的一种解决方案>>>

html部分

<!-- 注:因为扫码枪扫码时 如果是中文的输入环境会有输入法的影响 所以在扫码枪环境下 将type切换到password可以屏蔽输入法 -->

<el-input  :value="sourceCode" @input="inputCode" :type="isScan?'password':'text'" placeholder="溯源码" />

js部分

<script>

export default {
    data() {
        return {
            isScan: false,//是否为扫码枪录入
            sourceCode: ''
        }
    },
    created() {
        this.scanCode()
    },
    methods: {
        openCodeListDialog(row) {
            this.$refs.codeList.open(row)
        },
        /* 监听输入 判断通过isScan判断 */
        inputCode(v) {
            if (this.isScan) return;
            this.code = v
        },
        //处理扫码枪获取的数据
        dealScan(code) {
            this.isScan = false
            this.sourceCode = code.substring(code.length - 12);//取出后12位 
        },
        scanCode() {
            let lastTime = null;
            let nextTime = null;
            let code = '';
            let timer = ''
            //监听数据录入 通过判断输入数据的速度来判读是手动输入还是扫码枪录入,
            //这里有一个问题 当用户同时按下两个按键或者故意以高速录入数据时也会被判定为扫码枪输入
            document.onkeydown = e => {
                let keycode = e.keyCode || e.which || e.charCode;
                nextTime = new Date();
                if (keycode === 13) {
                    if (lastTime && (nextTime - lastTime < 30)) {
                        // 扫码枪
                        this.dealScan(code)
                    } else {
                        // 键盘
                        console.log('键盘输入')
                    }
                    code = '';
                    lastTime = null;
                    e.preventDefault();
                } else {
                    if (!lastTime) {
                        code = String.fromCharCode(keycode);
                    } else {
                        if (nextTime - lastTime < 30) {
                            code += String.fromCharCode(keycode);
                            item.isScan = true
                        } else {
                            code = '';
                            item.isScan = false
                        }
                    }
                    lastTime = nextTime;
                }
                //添加定时器 防止用户输入过快导致的误判 
                timer = setTimeout(_ => {
                    clearTimeout(timer)
                    this.isScan = false
                }, 100)
            };

        },
    },
}

</script>

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值