Javascript 如何在警报()后设置焦点()?

Javascript 如何在警报()后设置焦点()?,javascript,html,events,focus,Javascript,Html,Events,Focus,我有点像: <input type="textbox" id="partNumber" onChange="validatePart(this);"> <input type="textbox" id="quantity" onfocus="saveOldQuantity(this);"> function validatePart(node) { if (!node.value) { alert('Please enter a part num

我有点像:

<input type="textbox" id="partNumber" onChange="validatePart(this);">
<input type="textbox" id="quantity" onfocus="saveOldQuantity(this);">
function validatePart(node) {
    if (!node.value) {
        alert('Please enter a part number.');
        setTimeout(function(){node.focus();}, 1);
    }
}

你的代码似乎和我期望的一样。看这个。你看到其他行为了吗?我看到我在textbox1中键入了一个数字。然后当我切换到textbox2时,我得到了
无效部分错误,焦点停留在当前文本框上

更新-因为这似乎只是在Chrome上玩得很好,所以您可以跟踪是否存在错误。如果是这样,那就处理它

var error = null;
function checkForErrors() { 
   if (error) { error.focus(); error = null; }            
}

function validatePart(node) {
   if (badpart) { error = node; }
}

function saveOldQuantity(node) {
   checkForErrors();
}

添加一个小超时并将焦点重置回
partNumber
textbox应该可以做到这一点

因此,您的
validatePart()
函数类似于:

<input type="textbox" id="partNumber" onChange="validatePart(this);">
<input type="textbox" id="quantity" onfocus="saveOldQuantity(this);">
function validatePart(node) {
    if (!node.value) {
        alert('Please enter a part number.');
        setTimeout(function(){node.focus();}, 1);
    }
}

无论在
零件号
文本框中输入了什么,都会触发
警报
,并成功地将焦点返回到
零件号
文本框(即使您在
数量
文本框中使用tab键将其关闭。

在设置焦点之前,您是否可以尝试一个小的超时?这不是因为屏幕冻结。焦点会转到用户单击或tab键指向的任何位置。我需要以某种方式取消该操作并覆盖它,以将焦点返回到
零件号
。我不确定您是否可以阻止该操作。)用户无法选择另一个选项卡。我个人也不希望这样做。@pimvdb:也许这与其说是取消,不如说是加载一个页面并使用
node.focus();
将焦点交给一个节点。出于某种原因,
focus()
方法在这里不起作用。我在聚焦方面遇到一些问题,因此暂停它一段时间有时会有所帮助。例如,请尝试
setTimeout(function(){node.focus();},500);
。不要将字符串传递给
setTimeout
(它得到
eval
d),传递函数。
setTimeout(function(){document.getElementById(“零件号”).focus();},1)
@Rocket-你说得对。我修改了我的答案,以反映一个技术上更正确的版本,将一个函数传递给
setTimeout
函数,而不是一个需要在执行前进行
eval
d的字符串。@CraigTP:1毫秒超时对我有效。顺便说一句,我刚刚使用了一个通用的
函数()
作为第一个参数。谢谢!使用
setTimeout(function(){document.getElementById(node.id).focus();},1)
对我有用。没有文档就不行。getElementByIdOkay,看起来在IE9或FF中不行。在Chrome中可以很好地工作。会更好看一点。@Jonathan M-用非settimeout的答案更新了我的答案。我总是喜欢尝试避免这些。我希望它能像
node.focus()一样优雅
但是事件以错误的顺序播放才能正常工作。但是如果事件的顺序是一个问题,那么在
验证部分
有机会分配
错误
之前,
saveOldQuantity
不会调用
checkForErrors
吗?事件的顺序是一个问题调用
。focus()
从validatePart内部开始。现在我将该调用转移到saveOldQuantity的焦点。因此,事件的顺序已经解决。啊,是的。我理解。唯一能引导我远离这种方法的是使用全局(
error
)。但是,我绝对喜欢不依赖时间的方法。请投赞成票。)