如何在HTML表单上丢失焦点时重新聚焦到文本字段?

时间:2010-04-09 08:29:13

标签: javascript setfocus lost-focus

HTML表单上只有一个文本字段。用户输入一些文本,按Enter键,提交表单,然后重新加载表单。主要用途是条形码阅读。我使用以下代码将焦点设置为文本字段:

<script language="javascript">
    <!--
            document.getElementById("#{id}").focus()
    //-->
</script>

大部分时间都可以使用(如果没有人触摸屏幕/鼠标/键盘)。

但是,当用户在浏览器窗口(白色空白区域)内的某个字段外单击时,光标就消失了。一个单一的字段HTML表单,如何防止光标丢失?或者,如何在光标丢失后将光标重新聚焦在字段内? THX!

3 个答案:

答案 0 :(得分:8)

达林的答案是正确的,但在Firefox中不起作用。如果你想把重点放回到Firefox中,你必须将它推迟到事件发生之后:

<input onblur="var that= this; setTimeout(function() { that.focus(); }, 0);">

或者,更好,从JavaScript分配:

<script type="text/javascript">
    var element= document.getElementById('foo');
    element.focus();
    element.onblur= function() {
        setTimeout(function() {
            element.focus();
        }, 0);
    };
</script>

但是,我强烈建议你不要这样做。单击文本框外部以从该文本框中删除焦点是完全正常的浏览器行为,这可以是合法使用的(例如,为ctrl-F设置搜索点,或者开始拖动选择等)。不太可能有理由搞乱这种预期的行为。

答案 1 :(得分:2)

<input type="text" name="barcode" onblur="this.focus();" />

答案 2 :(得分:1)

您可以挂钩blur事件并重新重新聚焦该字段。这样做的用例很少,但听起来你的可能就是其中之一。请注意,您可能必须通过setTimeout或类似方式安排重新聚焦,您将无法在blur处理程序本身内执行此操作。

在不影响标记的情况下执行此操作时,如果您使用PrototypejQueryClosure等库,这是最简单的,但您可以在没有它们的情况下执行此操作(当然),你只需要自己处理浏览器差异。例如,使用Prototype:

document.observe("dom:loaded", function() {
    var elm = $('thingy');

    elm.focus();
    elm.observe('blur', function() {
        refocus.defer(elm);
    });

    function refocus(elm) {
        elm.focus();
    }
});

如果您不介意影响标记,可以使用onblur属性。例如,这至少适用于IE,Firefox和Chrome(可能还有其他):

HTML:

<input type='text' id='thingy' onblur="refocus(this);">

脚本:

function refocus(elm) {

    setTimeout(go, 0);

    function go() {
        elm.focus();
    }
}