Question: I have an HTML input

```
<input type="text" id="txtInput">

```

and I need to disable all keyboard keys for input, only to allow barcode scanners to get the data of the barcode and fill it with the input.

I tried "readonly" and "disabled" and javaScript keydown, but all those solutions disable everything including barcode scanners too.

Is there's any way for doing this?

Answer: 
So first you need to understand that barcode scanners pretend to be keyboards. So they will trigger JS keystroke events just like real keyboards. The only way I can think of to separate the 2 is some timing-based heuristic (the idea being that nobody can type an entire 10-digit barcode in less than 0.1 seconds).

So basically, you would have some javascript that would do something along these lines:

* (onkeydown) append the pressed key to a global string and start a timer with setTimeout (with very low delay, say 10 ms)
* (onkeydown) append the pressed key as before, but don't start the timer again
* in your setTimeout function, check if the string of keypresses is *at least* 3 keys (or longer, depending on the barcodes that you expect). If so, write the string to the input field. Otherwise, drop the string
* rinse and repeat

It's gonna be ugly, but if you're **really** desperate, it might work

```
var delay = (function(){
   var timer = 0;
   return function(callback, ms){
      clearTimeout (timer);
      timer = setTimeout(callback, ms);
   };
})();

$("#txtInput").on("input", function() {
   delay(function(){
      if ($("#txtInput").val().length < 8) {
          $("#txtInput").val("");
      }
   }, 20 );
});

```
I found a jquery script that detects input of keyboard vs scanner <https://jsfiddle.net/PhilM/Bf89R/3/> and had it modified to block keyboard entry, paste, and autofill.

in the html I disabled the autofil.

```
   <form autocomplete="off" onsubmit="return false">
  <input type="text" id="scanInput"/>
</form>

```

and then used the query to detect and block keybard and paste entry.

```
let inputStart, inputStop;

$("#scanInput")[0].onpaste = e => e.preventDefault();
// handle a key value being entered by either keyboard or scanner
var lastInput

let checkValidity = () => {
    if ($("#scanInput").val().length < 10) {
      $("#scanInput").val('')
  } else {
    $("body").append($('<div style="background:green;padding: 5px 12px;margin-bottom:10px;" id="msg">ok</div>'))
  }
  timeout = false
}

let timeout = false
$("#scanInput").keypress(function (e) {
  if (performance.now() - lastInput > 1000) {
    $("#scanInput").val('')
  }
    lastInput = performance.now();
    if (!timeout) {
    timeout = setTimeout(checkValidity, 200)
  }
});

```

demo here
<http://jsfiddle.net/uyzsb3o0/8/>