You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Ajax的keyup触发改为二维码扫码后即时触发的实现问题

问题解决:扫码填充身份证号后自动触发查询

问题原因

onchange事件需要输入框失去焦点才会触发,扫码填充后输入框通常仍处于聚焦状态,因此不会触发;而keyup会在每个字符输入后触发,不仅会导致多次无效AJAX请求,部分扫码器如果是批量填充内容(不模拟单个按键),甚至不会触发keyup。

解决方案

方案1:使用input事件+防抖函数

input事件会在输入框内容发生任何变化时触发(包括扫码、粘贴、键盘输入),配合防抖函数可以避免多次请求,等待输入完成后再执行查询。

修改后的AJAX代码:

$(document).ready(function() {
    // 防抖函数:延迟执行请求,避免连续触发
    function debounce(func, delay) {
        let timeoutId;
        return function() {
            clearTimeout(timeoutId);
            timeoutId = setTimeout(() => func.apply(this, arguments), delay);
        };
    }

    // 封装查询逻辑
    const fetchDetails = debounce(function() {
        var id_card = $(this).val().trim();
        // 身份证号长度校验,避免无效请求
        if (id_card.length !== 18) {
            document.getElementById("fullname").value = "";
            return;
        }
        
        $.ajax({
            url: "<?php echo base_url('index.php/scan/get_details'); ?>",
            method: 'post',
            data: {id_card: id_card},
            dataType: 'json',
            success: function(response) {
                document.getElementById("fullname").value = "";
                if (response.length > 0) {
                    document.getElementById("fullname").value = response[0].fullname;
                }
            }
        });
    }, 300); // 延迟300ms,可根据扫码速度调整

    // 绑定input事件,覆盖扫码/粘贴等场景
    $('#id_card').on('input', fetchDetails);
    // 兼容部分扫码器末尾触发的回车键
    $('#id_card').on('keyup', function(e) {
        if (e.key === 'Enter') {
            fetchDetails.call(this);
            e.preventDefault(); // 阻止回车默认行为,避免表单提交
        }
    });
});

方案2:监听扫码器的结束符(回车键)

多数扫码器可配置为扫码完成后发送Enter键,直接监听回车键触发查询即可:

$(document).ready(function() {
    $('#id_card').on('keydown', function(e) {
        if (e.key === 'Enter') {
            e.preventDefault();
            var id_card = $(this).val().trim();
            if (!id_card) return;
            
            $.ajax({
                url: "<?php echo base_url('index.php/scan/get_details'); ?>",
                method: 'post',
                data: {id_card: id_card},
                dataType: 'json',
                success: function(response) {
                    document.getElementById("fullname").value = "";
                    if (response.length > 0) {
                        document.getElementById("fullname").value = response[0].fullname;
                    }
                }
            });
        }
    });
});

额外优化说明

  • 移除原代码中无用的$("#id_card").load();:该方法用于加载HTML内容到元素,此处完全不需要。
  • 增加身份证号长度校验:减少向后台发送无效请求,提升效率。

内容的提问来源于stack exchange,提问作者asnka go

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:00:49