判斷掃碼輸入和手動輸入

項目中使用到了掃碼槍,記錄下使用方法。掃碼槍也是和鍵盤一樣的一種輸入設(shè)備,一般掃碼結(jié)束后會自帶回車,鍵入的速度會比手動輸入快,可以通過判斷輸入間隔時間判斷是掃碼輸入還是手動輸入。用掃碼槍時輸入法需要切換到英文,中文狀態(tài)下會有bug出現(xiàn)。

html中的一個input

<input class="sweep-box" placeholder="掃描條碼"
           ref="barcodeBox"
           type="text"
           @keyup="sweepBarcode($event)"
           @keydown="sweepDown">

js相關(guān)代碼

export default = {
  data() {
    return {
      keyUpTime: '', 
      keyDownTime: '', // 按鍵按下的時間
      spanTime: 20, // 一個按鍵按下到釋放的時間 小于等于則是掃碼,大于則是手動輸入
      oneKeyTime: '', // 一次按鍵之間的間隔時間
      twoKeyTime: '', // 兩次按鍵之間間隔
      code: '',
    }  
  },
  methods: {
    // 監(jiān)聽按鍵按下
    sweepDown() {
      let curTime = Date.now()
      if (this.keyDownTime !== '' && this.keyDownTime !== NaN) {
        this.twoKeyTime = curTime - this.keyDownTime
      }
      this.keyDownTime = curTime
    },
    // 監(jiān)聽按鍵釋放
    sweepBarcode(e) {
      let keyUpTime = Date.now()
      this.oneKeyTime = keyUpTime - this.keyDownTime
      let isHand = this.checkHandInput();
      if (!isHand) {
         // 掃描輸入狀態(tài)
        // 按鍵的值可以通過 e.key得到 掃碼槍一般掃碼結(jié)束后自帶回車,所以可以通過判斷 e.key 的值是否為 Enter 來設(shè)置掃碼結(jié)束后的操作 
        this.sweep(e)
      } else {
        // 手動輸入狀態(tài)
        if(e.key === 'Enter') {
          // 按下回車后的操作
        }
      }
    },
    // 判斷是掃碼還是手動輸入
    checkHandInput() {
      if ((this.oneKeyTime > this.spanTime)) {
        // 手動輸入
        return true;
      } else {
        // 掃碼輸入
        return false;
      }
    },
    sweep(e, type) {
    //  使用中是 win10系統(tǒng)的一個觸控屏幕,發(fā)現(xiàn)掃碼結(jié)束在回車后會有個 ArrowDown ,所以做了一下處理。
      if (e.key !== 'ArrowDown') {
          // 每次重新掃碼時 清空輸入框
         this.$refs.barcodeBox.value = ''
      }
      if (this.code) {
        if (e.key === 'Enter' || e.keyCode == 13 || e.which == 13) {
          // 得到掃碼的值
          this.code = this.handleShift(this.code)
          return
        }
        this.code = this.code + e.key
      } else {
        if (e.key === 'ArrowDown') {
          this.code = ''
        } else {
          this.code = e.key
        }
      }
    },
    // 在實際操作中發(fā)現(xiàn)在掃碼過程中通過 e.key去會去掃碼內(nèi)容時,遇到大寫字母時會得到 Shift + 小寫字母的組合,如 C 的話會是 Shiftc,所得會有不同,但是如果直接取 input 中的值則是沒有問題。
    // 所以在用 e.key 的方式獲取掃碼內(nèi)容時對 shift 進行以下處理。
   // 通過e.key得到所有掃碼的值后,通過Shift 對值進行分割,之后得到一個數(shù)組,然后對每個數(shù)組中每個元素中的第一個元素進行大寫轉(zhuǎn)換。
    handleShift(str) {
      // 判斷第一個字母是否需要大寫
        let string = str.slice(0, 5)
        let upperArr
        if (string === 'Shift') {
          let newArr = str.split('Shift')
          upperArr = newArr.map(item => {
            let item1
            if (item) {
              item1 = item.slice(0, 1).toUpperCase() + item.slice(1)
            }
            return item1
          })
        } else {
          let newArr = str.split('Shift')
          let headItem = newArr.slice(0, 1)
          let body = newArr.slice(1)
          let arr1 = body.map(item => {
            let item1 = item.slice(0, 1).toUpperCase() + item.slice(1)
            return item1
          })
          upperArr = headItem.concat(arr1)
        }
        return upperArr.join('')
      },
  }
}

參考了 git 上的一個關(guān)于掃碼的代碼
https://github.com/bigbignerd/jQuery_barcode_listener/blob/master/src/jquery.barcode.js

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容