Tengo un escáner de código de barras Datalogic Memor10 que se parece mucho a un teléfono Android, excepto que además tiene un escáner de código de barras en la parte delantera. El escáner de código de barras se puede activar presionando una tecla en el costado del Memor10. También tiene una característica que llama Keyboard Wedge que afortunadamente está habilitada de forma predeterminada, ya que no pude averiguar cómo cambiar su complicada configuración. Aparentemente, Keyboard Wedge hace que cualquier código de barras escaneado también se escriba como pulsaciones de teclas; para que, por ejemplo, cuando tenga una etiqueta de input en una aplicación web, escriba el código de barras en esa entrada como pulsaciones de teclas.
Esto funciona muy bien para códigos de barras simples, sin embargo, el código de barras que me gustaría escanear es un código de barras de licencia de conducir de Sudáfrica que está encriptado con encriptación RSA y, por lo tanto, las pulsaciones de teclas devueltas podrían ser cualquier carácter de byte. Esto es un problema, ya que las pulsaciones de teclas como Tab e Enter dejarían el campo de entrada o enviarían de forma predeterminada.
La etiqueta de formulario incluida es solo para evitar el envío de formularios nativos de Oracle Apex.
Intenté sin éxito evitar esto y solo obtuve los códigos de bytes como caracteres hexadecimales con una pantalla de entrada simple en Oracle Apex. Mi código Javascript/jQuery/HTML es actualmente el siguiente:
Región de contenido estático:
<form method="POST" action="javascript:void(0);"> <input type="text" id="barcode" name="barcode"> </form>Al cargar la página:
/* $("#barcode").on('keyup', function(e) { console.log(e.keyCode.toString(16)); e.preventDefault(); }); */ $("#barcode").keypress(function(event) { console.log(event.which.toString(16)); event.preventDefault(); }); Sin embargo, esto no funciona bien, ya que Tab aún deja el campo de entrada e Enter funciona la primera vez y luego deja de funcionar, solo para comenzar a funcionar nuevamente si presiona otra tecla en el medio. No estoy seguro de qué otros códigos de bytes podrían causar problemas. ¿Qué código puedo usar para capturar con éxito la cadena larga de códigos de bytes enviados como pulsaciones de teclas a la etiqueta de entrada por el escáner de código de barras Memor10? ¿O hay alguna otra forma de lograr esto? Me gustaría que esta fuera una aplicación web y no una aplicación nativa de Android.
El evento de keypress de tecla se activa cuando se presiona el valor de un carácter . Además, está en desuso. Debe usar el evento keydown , que se activa para todas las teclas.
<form method="POST" action="javascript:void(0);"> <input type="text" id="barcode" name="barcode"> </form> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script> /*$("#barcode").on('keyup', function(e) { console.log(e.keyCode.toString(16)); e.preventDefault(); });*/ $("#barcode").on('keydown',function(event) { console.log(event.which.toString(16)); event.preventDefault(); }); </script>Este primer fragmento te ayudará a evitar que el tabulador cause daños.
Luego, para ver si hay problemas con otros códigos clave, escribí un script que activará un evento para todos los códigos clave del 0 al 256.
$("#barcode").on('keydown',function(event) { console.log(event.keyCode.toString(16)); event.preventDefault(); }); const el = document.getElementById('barcode') for (let i = 0; i < 256; ++i) { el.dispatchEvent(new KeyboardEvent('keydown',{'keyCode':i})); } <form method="POST" action="javascript:void(0);"> <input type="text" id="barcode" name="barcode"> </form> <script src="https://code.jquery.com/jquery-3.6.0.slim.min.js" integrity="sha256-u7e5khyithlIdTpu22PHhENmPcRdFiHRjhAuHcs05RI=" crossorigin="anonymous"></script>Parece funcionar. Ahora puede reunir todas las pulsaciones de teclas en una matriz para recomponer su código de barras.