2011-08-29 20 views
9

我有类似:如何在alert()后给焦点()?

<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?? 
    } 
} 
+2

您可以在设置焦点之前尝试一个小超时吗? – pimvdb

+0

并不是屏幕冻结,焦点会转到用户点击或选中的位置,我需要以某种方式取消t帽子动作并重写它以将焦点返回到'partNumber'。 –

+0

我不确定您是否可以阻止用户选择其他选项卡。我个人也不会喜欢这一点。 – pimvdb

回答

18

添加一个小的超时和重置焦点回到partNumber文本框应该做的伎俩。

因此您validatePart()功能变得像:

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

Here's a quick "live" example简单地把一个点燃的alert不管是进入partNumber文本框,并成功返回焦点回到partNumber文本框(即使你标签关闭它到quantity文本框

+1

不要传递一个字符串到'setTimeout'(它获得'eval'd),传递一个函数。 'setTimeout(function(){document.getElementById(“partNumber”)。focus();},1);' –

+0

@Rocket - 你是对的。我已经修改了我的答案,以便通过向'setTimeout'函数传递一个函数来反映技术上更加正确的版本,而不是在执行之前需要'eval'd的字符串。 – CraigTP

+0

@CraigTP:一个1毫秒的超时值为我工作。顺便说一句,我只是使用了一个通用的'function()'作为第一个参数。谢谢! –

2

你的代码似乎预期为我工作。请参阅fiddle。你是否看到其他一些行为?我看到我在textbox1中输入了一个数字。然后,当我切换到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(); 
} 
+0

好吧,看起来像这样在IE9或FF中不起作用。在Chrome中运行良好。会看起来更多一点。 – mrtsherman

+0

@Jonathan M - 用非settimeout答案更新了我的答案。我总是喜欢尝试和避免这些。我希望它可以像'node.focus()'一样优雅,但事件按照错误的顺序播放。 – mrtsherman

+0

但是,如果事件的顺序是一个问题,在'validatePart'之前'saveOldQuantity'调用'checkForErrors'是否有机会分配'error'? –

相关问题