我有一些像:
<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调试窗口的交互,当然,改变焦点。
如果在validatePart()
中检测到错误,我如何确保焦点返回到partNumber
?
编辑: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);
}
}
下面是一个快速的"实时"示例,无论在partNumber
文本框中输入什么,都简单地触发alert
,并成功地将焦点返回到partNumber
文本框(即使您将其选项卡关闭到quantity
文本框)。
您的代码似乎为我预期的工作。看这把小提琴。你有没有看到其他的行为?我看到我在textbox1中输入了一个数字。然后,当我tab over到textbox2我得到Invalid Part!
错误和焦点停留在当前文本框。
更新-因为这似乎只在Chrome中发挥不错,你可以跟踪是否存在错误。如果是,那么处理它。
var error = null;
function checkForErrors() {
if (error) { error.focus(); error = null; }
}
function validatePart(node) {
if (badpart) { error = node; }
}
function saveOldQuantity(node) {
checkForErrors();
}