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

Cognex MX-1000扫码内层回调无法退出,扫码值始终写入第三个文本框

解决Cognex MX-1000扫码回调嵌套导致的焦点与输入异常问题

我明白你遇到的麻烦了——嵌套的setResultCallback把你困在了第三个文本框的逻辑里,每次扫码都只会往第三个框写内容,根本跳不出来。这是因为你每次扫码后都在覆盖前一个回调函数,第三次扫码完成后,回调就固定成处理第三个文本框的逻辑了,完全没有机制让它回到处理第一个框的状态。

问题根源

你原来的代码采用嵌套设置回调的方式:第一次扫码后设置第二个回调,第二次扫码后设置第三个回调,但第三个回调生效后,没有任何逻辑去重置它,导致后续所有扫码操作都会触发这个最内层的回调,自然只会往第三个文本框写入值,完全无视当前的焦点位置。

解决方案:用状态变量替代嵌套回调

我们可以用一个独立的状态变量来跟踪当前应该填充的文本框,只设置一个全局回调函数,在回调里根据状态值处理对应文本框,完成后更新状态并切换焦点。这种方式彻底避免了嵌套回调无法退出的问题。

修改后的代码示例:

// 状态变量:跟踪当前要填充的文本框序号,初始指向第一个文本框
let currentTargetTextBox = 1;

// 只设置一次全局扫码回调
me.scanner.setResultCallback(function(result) {
    const barcodeContent = result.readString;
    
    switch(currentTargetTextBox) {
        case 1:
            document.getElementById("TextBox1").value = barcodeContent;
            document.getElementById("TextBox2").focus();
            currentTargetTextBox = 2; // 更新状态为下一个文本框
            break;
        case 2:
            document.getElementById("TextBox2").value = barcodeContent;
            document.getElementById("TextBox3").focus();
            currentTargetTextBox = 3; // 更新状态为下一个文本框
            break;
        case 3:
            document.getElementById("TextBox3").value = barcodeContent;
            document.getElementById("TextBox1").focus();
            currentTargetTextBox = 1; // 完成一轮后重置状态到第一个文本框
            break;
    }
});

代码逻辑说明

  • 状态变量currentTargetTextBox:用来记录当前需要填充的文本框序号,每次扫码完成后更新这个值,让下一次扫码明确知道该处理哪个框。
  • 单一全局回调:所有扫码操作都进入同一个回调函数,通过switch判断当前状态,执行对应的赋值和焦点切换逻辑。
  • 循环重置机制:处理完第三个文本框后,自动把状态重置为1,这样下一次扫码就会回到第一个文本框,完美实现循环切换的需求。

这种方式不仅解决了“无法退出内层回调”的核心问题,还让代码逻辑更清晰、更容易维护,完全符合你最初的扫码自动切换焦点的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:19:15