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
相关产品推荐
相关产品推荐

