如何限制keypress/keyup/keydown操作并仅在ajax调用完成时执行

How to restrain keypress/keyup/keydown action and execute only if ajax call is finished

本文关键字:ajax 调用 完成时 执行 操作 keypress 何限制 keyup keydown      更新时间:2023-09-26

我有一把扫描速度很快的条形码扫描枪。由于条形码扫描仪被视为键盘动作,有时我会连续两次发射枪,文本框不会停止在上面输入值(即使枪在输入所有扫描值后自动发射输入命令键代码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)