我有类似的东西:

<input type="textbox" id="partNumber" onChange="validatePart(this);">
<input type="textbox" id="quantity" onfocus="saveOldQuantity(this);">

进行更改并且文本框失去焦点之后,onChange事件已正确触发。当quantity成为焦点时,onfocus事件会正确触发以保存quantity的旧值,然后再进行更改。

如果validatePart()检测到无效的partNumber值,则会将用户alert告知该事实。清除alert()后,我想将焦点返回到partNumber输入。但是,在输入节点上执行focus()并不会使其获得焦点。调试在这里很棘手,因为IE调试窗口的交互当然会改变焦点。

如果在partNumber中检测到错误,如何确保焦点返回到validatePart()

编辑:validatePart()的简单版本:
function validatePart(node) {
    if (!node.value) {
        alert('Please enter a part number.');
        node.focus();   // <======= why isn't this having any effect??
    }
}

最佳答案

添加一个小的超时并将焦点重新设置回partNumber文本框应该可以解决问题。

因此,您的validatePart()函数变为:

function validatePart(node) {
    if (!node.value) {
        alert('Please enter a part number.');
        setTimeout(function(){node.focus();}, 1);
    }
}

无论输入alert文本框中输入了什么,Here's a quick "live" example都会简单地触发partNumber并成功地将焦点返回到partNumber文本框(即使您将其标签到quantity文本框也是如此)。

10-06 15:17