我有一把扫描速度很快的条形码扫描枪。由于条形码扫描仪被视为键盘动作,有时我会连续两次发射枪,文本框不会停止在上面输入值(即使枪在输入所有扫描值后自动发射输入命令键代码13)。
这是我的代码:
$('#sku_upc_input').keyup(function(e) {
var code = (e.keyCode ? e.keyCode : e.which);
switch (code) {
case 13:
$(this).attr('disabled', 'disabled');
$(this).parents('form').submit();
break;
}
});
因此,在提交时,它会启动ajax。
$('#add_scans_sku_form').submit(function (e) {
$.ajax({
url: '/netsuite/po/checkUPCSkipCapture/',
data: {
po_num: current_po.id,
upc_code: $('#upcCode').val(),
sku_id: sku_id
},
type: 'POST',
dataType: 'json',
success: function(data) {
if (data['status'] != false) {
initUPCPopup(sku_id, desc);
} else {
$('#sku_upc_input').val('');
$('#sku_upc_input').focus();
}
}
});
)};
我做了一个解决方案,在按键代码13(输入)后,文本框会自动禁用,这样枪就不会在文本框上输入额外的值(如果立即再次开火),但另一个缺陷是,有时,当你连续快速开火时,接收扫描值的文本框会输入不完整的值,比如说。如果条形码是WORAS012-Z,它有时会是RAS012-Z,甚至是S012-Z。
这把枪的动作如此之快,以至于在连续射击时很难完美地获得完整的数值。我希望我的问题能被理解。我希望有解决办法。请给我一些想法。非常感谢。
如果您希望扫描仪只在ajax调用完成后进行扫描,则应该设置一个变量来了解它是否已经完成。
var completed = true; //<<<<< define the variable
$('#sku_upc_input').keyup(function(e) {
var code = (e.keyCode ? e.keyCode : e.which);
switch (code) {
case 13:
if ( !completed ) return; //<<<<< cancel action if it's not completed yet
$(this).attr('disabled', 'disabled');
$(this).parents('form').submit();
break;
}
});
$('#add_scans_sku_form').submit(function (e) {
completed = false; //<<<<< set to false when fired
$.ajax({
url: '/netsuite/po/checkUPCSkipCapture/',
data: {
po_num: current_po.id,
upc_code: $('#upcCode').val(),
sku_id: sku_id
},
type: 'POST',
dataType: 'json',
success: function(data) {
completed = true //<<<<< set back to true when complete
if (data['status'] != false) {
initUPCPopup(sku_id, desc);
} else {
$('#sku_upc_input').val('');
$('#sku_upc_input').focus();
}
}
});
)};
我不确定那是什么样的扫描仪,也不知道它是如何工作的,但根据你所说的,我认为更好的方法是取消200-500ms的所有内容,而不是根据你的ajax调用的速度:
var completed = true;
// at the start of your event handler
if ( !completed ) return;
completed = false;
setTimeout(function(){
completed = true;
},200)