Article Detail

js监听页面扫码枪

// 扫码枪 var code = ""; var lastTime, nextTime; var lastCode, nextCode; document.o...

HTML 阅读 34.3万 2 分钟阅读 2022-07-26 17:01
GDScript3
67 行
// 扫码枪
    var code = "";
    var lastTime, nextTime;
    var lastCode, nextCode;
    document.onkeypress = function (e) {
        if (window.event) { // IE
            nextCode = e.keyCode;
        } else if (e.which) { // Netscape/Firefox/Opera
            nextCode = e.which;
        }
        if (nextCode === 13) {
            if (code.length < 3) return; // 手动输入的时间不会让code的长度大于2,所以这里只会对扫码枪有

            console.log(code); // 获取到扫码枪输入的内容,做别的操作
            
            // 得到扫码枪的值,请求数据库,返回结果
            $.ajax({
                type: "POST",
                url: "{:url('barcode_select')}",
                data: {barcode: code},
                dataType: "json",
                success: function (res) {
                    if (res.code == 0){
                        var data = res.data

                        var shop_name = '';
                        for(var i = 0; i < (data.shopinfo).length; i++){
                            shop_name = data.shopinfo[i].name + '和' + shop_name
                        }
                        var shop_str = shop_name.substr(0, shop_name.length-1);

                        // 给搜索框赋值并搜索
                        $("#keys").attr("value", data.barcode);
                        $("#search").click();

                        // 拼接需要语音播报的值
                        var str = data.goods_name + data.color + data.size_name + '属于' +shop_str
                      
                        // 调用语音播报的方法
                        speckText(str);

                    }else {
                        console.log('111')
                    }
                },error: function (error) {
                    console.log(11)
                }
            });

            code = '';
            lastCode = '';
            lastTime = '';
            return;
        }
        nextTime = new Date().getTime();
        if (!lastTime && !lastCode) {
            code += e.key;
        }

        if (lastCode && lastTime && nextTime - lastTime > 30) { // 当扫码前有keypress事件时,防止首字缺失
            code = e.key;
        } else if (lastCode && lastTime) {
            code += e.key;
        }
        lastCode = nextCode;
        lastTime = nextTime;
    }
Comments 评论区
广西南宁市 2022-07-26 17:24
JavaScript
60 行
openCodeListDialog(row) {
console.log(row)
     this.$refs.codeList.open(row)
 },
 /* 监听输入 判断通过isScan判断 */
 inputCode(v) {
   console.log(v)
     if (this.isScan) return;
     this.code = v
 },
 //处理扫码枪获取的数据
 dealScan(code) {
     this.isScan = false
     this.sourceCode = code.substring(code.length - 12);//取出后12位 
 },
 scanCode() {
   console.log(1)
     let lastTime = null;
     let nextTime = null;
     let code = '';
     let timer = ''
     //监听数据录入 通过判断输入数据的速度来判读是手动输入还是扫码枪录入,
     //这里有一个问题 当用户同时按下两个按键或者故意以高速录入数据时也会被判定为扫码枪输入
     document.onkeydown = e => {
       console.log(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)
     };

 },
| | #0
广西南宁市 2022-07-26 17:24
GDScript3
39 行
//监听扫码枪
function ListenScanCodeGun() {
    var barCode = '';
    var lastTime = 0;
    function ClearBarCode() {
        barCode = '';
        lastTime = 0;
    }
    window.addEventListener('keypress', function (e) {
        console.log("监听开始");
        e = e || window.event;
        var currCode = e.keyCode || e.which || e.charCode;
        var currTime = new Date().getTime();
        if (lastTime > 0) {
            if (currTime - lastTime <= 100) {
                barCode += String.fromCharCode(currCode);
            }
            else if (currTime - lastTime > 500) {
                // 输入间隔500毫秒清空
                ClearBarCode();
            }
        }
        else  // 第一次按键
        {
            barCode = String.fromCharCode(currCode);
        }
        lastTime = currTime;

        if (currCode == 13)  // 回车
        {
            if (barCode && barCode.length >= 8) {
                // 这里得到码,做下一步业务处理
                console.log("最终编号:" + barCode);
            }
            // 回车输入后清空
            ClearBarCode();
        }
    });
}
| | #0
广西南宁市 2022-07-26 17:24
GDScript3
53 行
<script>
export default {
  data() {
    return {
    }
  },
  mounted() {
    // 监听按键
    var code = ''
    var lastTime, nextTime // 上次时间、最新时间
    var lastCode, nextCode // 上次按键、最新按键
    document.onkeypress = (e) => {
      // 获取按键
      if (window.event) { // IE
        nextCode = e.keyCode
      } else if (e.which) { // Netscape/Firefox/Opera
        nextCode = e.which
      }
      // 如果触发了回车事件(扫码结束时间)
      if (nextCode === 13) {
        if (code.length < 3) return // 手动输入的时间不会让code的长度大于2,所以这里只会对扫码枪有

        this.codeFind(code) // 获取到扫码枪输入的内容,做别的操作

        code = ''
        lastCode = ''
        lastTime = ''
        return
      }
      nextTime = new Date().getTime() // 记录最新时间
      if (!lastTime && !lastCode) { // 如果上次时间和上次按键为空
        code += e.key // 执行叠加操作
      }
      // 如果有上次时间及上次按键
      if (lastCode && lastTime && nextTime - lastTime > 30) { // 当扫码前有keypress事件时,防止首字缺失
        code = e.key
      } else if (lastCode && lastTime) {
        code += e.key
      }
      lastCode = nextCode
      lastTime = nextTime
    }
  },
  methods: {
    // 业务逻辑根据项目更改
    codeFind(code) {
      if ([123456, 789101].indexOf(code) >= 0) {
        alert('code已经存在')
      }
    }
  }
}
</script>
| | #0
广西南宁市 2022-07-26 17:26

vue使用扫码枪,全局监听

全局监听扫码枪的扫码数据
在 src 下新建文件 scanCode.js,并在 main.js 引入即可

scanCode.js

GDScript3
23 行
import store from './store'
function scanCode() {
  let str = ''
  document.onkeydown = function() {
    if (event.target.tagName !== 'BODY') {
      str = ''
    } else {
      if (event.keyCode !== 13) {
        if (event.keyCode >= 32 && event.keyCode <= 126) {
          let k = event.key
          str += k
        }
      } else {
        if (str) {
          store.commit('scanCode/SET_SCANSTRING', str)
        }
        str = ''
      }
    }
  }
}

export default scanCode()

main.js

JavaScript
14 行
import Vue from 'vue'
import App from './App'
import store from './store'
import router from './router'
import './scanCode' // 扫码

Vue.config.productionTip = false

new Vue({
  el: '#app',
  router,
  store,
  render: h => h(App)
})

增加扫码的vuex
在modules中新建文件scanCode.js,并在getters.js中增加scanString: state => state.scanCode.scanString

GDScript3
12 行
export default {
  namespaced: true,
  state: {
    // 扫码的值
    scanString: ''
  },
  mutations: {
    SET_SCANSTRING: (state, scanString) => {
      state.scanString = scanString
    }
  }
}

监听vuex中scanString的变化

GDScript3
19 行
export default {
  computed: {
    scanString() {
      return this.$store.getters.scanString
    }
  },
  watch: {
    scanString(s) {
      if (s) {
        setTimeout(() => {
          // 触发事件 你要做的事
          alert(s)
          // 执行结束后重复为空
          this.$store.commit('scanCode/SET_SCANSTRING', '')
        }, 100)
      }
    }
  }
}
| | #0
广西南宁市 2022-07-26 17:27
GDScript3
35 行
// 监听按键
var code = ''
var lastTime, nextTime // 上次时间、最新时间
var lastCode, nextCode // 上次按键、最新按键
document.onkeypress = (e) => {
  // 获取按键
  if (window.event) { // IE
    nextCode = e.keyCode
  } else if (e.which) { // Netscape/Firefox/Opera
    nextCode = e.which
  }
  // 如果触发了回车事件(扫码结束时间)
  if (nextCode === 13) {
    if (code.length < 3) return // 手动输入的时间不会让code的长度大于2,所以这里只会对扫码枪有

    this.codeFind(code) // 获取到扫码枪输入的内容,做别的操作

    code = ''
    lastCode = ''
    lastTime = ''
    return
  }
  nextTime = new Date().getTime() // 记录最新时间
  if (!lastTime && !lastCode) { // 如果上次时间和上次按键为空
    code += e.key // 执行叠加操作
  }
  // 如果有上次时间及上次按键
  if (lastCode && lastTime && nextTime - lastTime > 30) { // 当扫码前有keypress事件时,防止首字缺失
    code = e.key
  } else if (lastCode && lastTime) {
    code += e.key
  }
  lastCode = nextCode
  lastTime = nextTime
}
| | #0
Comment Form 留下评论
正在回复 #0
粘贴图片、拖拽文件,或点上面的按钮上传 图片会自动插入 [img] 标签,其他附件会自动插入 [attach] 标签。
正在上传...
提交前会先拉起旧项目同款第三方人机验证。

不再要求填写昵称;reply 会生成一条带楼层回链的新评论,quote 会附带完整引用块,并保持评论锚点跳转。

lizhenqiu blog is powered by lizhenqiu.com Version 6.9

Processed in 0.0383 second(s) W3C

本博客的所有原创作品采用 知识共享 署名-非商业性使用-相同方式共享 2.5 协议 进行许可

本站由 七七牛 云存储 阿阿里云 计算与安全服务 拍又拍云 CDN 加速 百百度智能 AAMH 布布集网 AI指南针AI

桂公网安备 45010302000998号 桂ICP备15007619号-1 中国互联网举报中心 建议使用谷歌浏览器浏览
Navigation 文章导航
⌂ ↓ ↑
100%
图片预览
Gallery 图集
0 张图片

正在整理正文和评论里的图片。

当前页还没有可展示的图片。
Quick Comment 快速评论

直接输入内容,提交时仍会走当前页面的人机验证。

正在上传...
操作提示