Javascript:隐藏输入条形码扫描仪
以下是我当前的设置: 我有一个键盘模式的条形码扫描仪。 我正试图扫描到一个隐藏的、失焦的输入。 我试图读取的条形码如下:星号[barcode info]星号并粘贴为|[barcode info]。(Stackoverflow不允许我只放置星号,但星号代表的就是星号。) 转化Javascript:隐藏输入条形码扫描仪,javascript,input,barcode,barcode-scanner,hidden-field,Javascript,Input,Barcode,Barcode Scanner,Hidden Field,以下是我当前的设置: 我有一个键盘模式的条形码扫描仪。 我正试图扫描到一个隐藏的、失焦的输入。 我试图读取的条形码如下:星号[barcode info]星号并粘贴为|[barcode info]。(Stackoverflow不允许我只放置星号,但星号代表的就是星号。) 转化 <input type="hidden" name="barcode-input" value="" id="barcode-input"
<input type="hidden" name="barcode-input" value="" id="barcode-input" onchange="this.form.submit()" />
在
如果屏幕上没有
输入[type=“text”]
元素,则需要手动捕获键盘输入。大致如下:
document.addEventListener('keydown', (ev) => {
if (ev.ctrlKey || ev.altKey) return; // Ignore command-like keys
if (ev.key == 'Enter') {
// ...submit the content here...
} else if (ev.key == 'Space') { // I think IE needs this
document.getElementById('barcode-input').value += ' ';
} else if (ev.key.length == 1) { // A character not a key like F12 or Backspace
document.getElementById('barcode-input').value += ev.key;
}
});
这将为您提供大部分方法……或者,不要在输入(*)上查找事件,而是在值上定义事件,并使用输入事件简单地设置值 一旦输入停止,不管是1秒(或者很可能更短),然后启动表单 如果必须将光标置于输入中,则扫描。您唯一的选项是使用“自动聚焦”属性并隐藏输入,因为您无法聚焦隐藏的元素,尽管您也无法聚焦多个元素,因此请记住,如果您要扫描多个输入,则必须显示输入,无法绕过它 比如说
let elm=document.querySelector('input[name=“barcode input”]”)
//值上的观察者,在1秒后,它调用一个事件,即post表单
设定时器=0
Object.defineProperty(窗口“条形码”{
get:function(){returnthis.value},
设置:函数(值){
清除超时(计时器)
this.value=value
计时器=设置超时(()=>{
console.log('Post form')
},1000)//进行一些测试,如果远远少于1秒,则调整以输入值
}
})
//它应该触发输入,即使它是一个键盘
elm.addEventListener(“输入”,e=>barcode=e.target.value)
//忽略,在这条线下。。
//每隔一段时间设置一个条形码值,只有当它停止输入(>1秒)时,它才会触发回调
设i=0
设t=setInterval(()=>{
条形码=(条形码| |“”)+“X”
如果(i>=40)清除间隔(t)
我++
}, 100)
//忽略。。。从隐藏输入中获取值,放入#当前
setInterval(()=>document.querySelector('#current')。innerHTML=barcode,1000)
这是一个使用
按键的演示器,它扫描传入的密钥流以查找*[
,并捕获条形码,直到它看到]*
。然后它将代码发送到服务器。虽然我已经在您的HTML中复制了表单,但是这里的代码没有使用它
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
Working...
<form method="post">
<input type="hidden" name="action" value="barcode-scan"/>
<input type="hidden" name="barcode-input" value="" id="barcode-input" onchange="this.form.submit()" />
</form>
<p id="response"></p>
<script>
(function(){
"use strict";
const bcAst = '*';
const bcLeft = '[' ;
const bcRight = ']';
let barcodeIncoming = false;
let lastChar = 0;
let barcode = '';
document.addEventListener('keypress', function(e){
function sendCode(barcode) {
console.log(barcode);
let fd = new FormData();
fd.append('barcode', barcode);
fetch('myFile.php', {
method: 'POST',
body: fd
})
.then(resp=>{
resp.text().then(txt=>{document.getElementById('response').innerText = txt;})
});
}
console.log(e.key);
switch (e.key) {
case bcAst:
if (barcodeIncoming && (lastChar === bcRight)) {
barcodeIncoming = false;
sendCode(barcode);
}
break;
case (bcLeft):
if (lastChar === bcAst) {
barcodeIncoming = true;
barcode = '';
}
break;
case (bcRight):
break;
default:
barcode += (barcodeIncoming)?e.key:'';
break;
}
lastChar = e.key;
});
})();
</script>
</body>
</html>
标题
工作
(功能(){
“严格使用”;
常量bcAst='*';
常量bcLeft='[';
常量bcRight=']';
让barcodeIncoming=false;
设lastChar=0;
让条形码=“”;
文档.添加的文本列表器('keypress',函数(e){
功能发送代码(条形码){
控制台日志(条形码);
设fd=newformdata();
fd.追加('条形码',条形码);
fetch('myFile.php'{
方法:“POST”,
正文:fd
})
。然后(resp=>{
resp.text().then(txt=>{document.getElementById('response')。innerText=txt;})
});
}
控制台日志(e.key);
开关(电子钥匙){
案例bcAst:
if(条码输入&(lastChar==bcRight)){
条码输入=假;
发送代码(条形码);
}
打破
案例(左):
if(lastChar==bcAst){
条形码输入=真;
条形码='';
}
打破
案例(右):
打破
违约:
条形码+=(条形码输入)?e.键:“”;
打破
}
lastChar=e.key;
});
})();
当前服务器文件非常粗糙,但其用途如下:
<?php
if (isset($_POST['barcode'])) {
echo "Your barcode is {$_POST['barcode']}";
} else {
echo "No barcode found";
}
将输入类型更改为不支持的值有什么帮助?如果您想将其更改为type=“text”
,您就错过了问题的要点。如果该值与您所说的type=text一起工作,则为。在过去,我使用style=“display:none;”不显示字段,但值在那里。我想他是想选择type=“text”,他还添加了display:none作为样式标记。也就是说,我仍然需要捕获输入,并更改输入字段的值。。。然后处理这样一个事实,即它现在是页面上的一个物理元素,需要以一种不干扰其他任何内容的方式进行排列。抱歉,然后我不明白,我认为@mark warren更好地回答了您:-)我错过了显示:无
。这就是为什么对您的建议添加一个解释而不仅仅是转储一个代码片段是值得的。然而,这方面还有其他问题。
document.addEventListener('keydown', (ev) => {
if (ev.ctrlKey || ev.altKey) return; // Ignore command-like keys
if (ev.key == 'Enter') {
// ...submit the content here...
} else if (ev.key == 'Space') { // I think IE needs this
document.getElementById('barcode-input').value += ' ';
} else if (ev.key.length == 1) { // A character not a key like F12 or Backspace
document.getElementById('barcode-input').value += ev.key;
}
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
Working...
<form method="post">
<input type="hidden" name="action" value="barcode-scan"/>
<input type="hidden" name="barcode-input" value="" id="barcode-input" onchange="this.form.submit()" />
</form>
<p id="response"></p>
<script>
(function(){
"use strict";
const bcAst = '*';
const bcLeft = '[' ;
const bcRight = ']';
let barcodeIncoming = false;
let lastChar = 0;
let barcode = '';
document.addEventListener('keypress', function(e){
function sendCode(barcode) {
console.log(barcode);
let fd = new FormData();
fd.append('barcode', barcode);
fetch('myFile.php', {
method: 'POST',
body: fd
})
.then(resp=>{
resp.text().then(txt=>{document.getElementById('response').innerText = txt;})
});
}
console.log(e.key);
switch (e.key) {
case bcAst:
if (barcodeIncoming && (lastChar === bcRight)) {
barcodeIncoming = false;
sendCode(barcode);
}
break;
case (bcLeft):
if (lastChar === bcAst) {
barcodeIncoming = true;
barcode = '';
}
break;
case (bcRight):
break;
default:
barcode += (barcodeIncoming)?e.key:'';
break;
}
lastChar = e.key;
});
})();
</script>
</body>
</html>
<?php
if (isset($_POST['barcode'])) {
echo "Your barcode is {$_POST['barcode']}";
} else {
echo "No barcode found";
}