Обработчик событий Keyup пропускает первое событие - PullRequest
0 голосов
/ 02 июля 2019

С помощью этого решения я написал простую привязку к обработчику штрих-кода: оператор может запустить некоторую функцию, отсканировав штрих-код в форме.

Я не знаю почему, но первоесобытие (символ) после загрузки документа игнорируется обработчиком ключей (Barcode scanner._keyup ()).Это заставляет меня генерировать фиктивное событие keyup сразу после его инициализации.При этом сфокусированный элемент графического интерфейса заполняется правильно - начальным символом (

var BarcodeScanner = function () {
  this.initialize.apply(this, arguments);
}

BarcodeScanner.prototype = {
  initialize: function () {
    let self = this;

    // Change context for document's event handler
    $(document).on("keyup", $.proxy(self._keyup, self));

    // I dont know why this thing skips first event - and symbol
    // This is my temporary solution
    //let e = $.Event('keyup');
    //e.which = 17; // Control
    //$(document).trigger(e);
  },
  _timeoutHandler: 0,
  _inputString: '',
  _inputKeyCodes: [],
  references: {},
  barcodescanned: function (input_string) {
  },
  _keyup: function (event) {
    let self = this;

    if (self._timeoutHandler) {
      clearTimeout(self._timeoutHandler);
      // this._inputString += String.fromCharCode(event.keyCode);
      self._inputKeyCodes.push(event.keyCode);
    }

    self._timeoutHandler = setTimeout($.proxy(function () {
      if (self._inputKeyCodes.length <= 10) {
        self._inputKeyCodes = [];
        return;
      }

      console.log(self._inputKeyCodes);
      self.convertInputString();
      self._inputKeyCodes = [];

      $.each(this.references, function (barcode, handler) {
        if (barcode.startsWith(self._inputString)) {
          handler(barcode);
        }
      });

    }, this), 20);
  },
  convertInputString: function () {
    let self = this;

    self._inputString = '';

    let shift = false;
    $.each(self._inputKeyCodes, function (idx, keyCode) {
      if (keyCode === 16) { // Shift
        shift = true;
        return true; // next

      } else if (keyCode < 32) { // Ignore
        return true; // next

      } else if (keyCode >= 65 && keyCode <= 90) { // Letter
        if (!shift) {
          keyCode += 32; // Lowercase
        }
        shift = false;
      }

      let symbol = String.fromCharCode(keyCode);
      self._inputString += symbol;
    });
  }
}

Использование:

      let doThis = function (barcode) {
        console.log('Doing this');
      }
      let doThat = function (barcode) {
        console.log('Doing that');
      }

      let barcode_scanner = require('barcode_scanner.js');
      barcode_scanner.references = {
        'w6oqacBEfT': doThis,
        'fSPOhbHdgy': doThat,
      };

Выход:

(14) [16, 83, 16, 80, 16, 79, 72, 66, 16, 72, 68, 71, 89, 13]
(15) [70, 16, 83, 16, 80, 16, 79, 72, 66, 16, 72, 68, 71, 89, 13]
Doing that
...