Javascript 当HTML表单失去焦点时,如何重新聚焦到文本字段?

Javascript 当HTML表单失去焦点时,如何重新聚焦到文本字段?,javascript,setfocus,lost-focus,Javascript,Setfocus,Lost Focus,HTML表单上只有一个文本字段。用户输入一些文本,按Enter键,提交表单,然后重新加载表单。主要用途是条形码读取。我使用以下代码将焦点设置为文本字段: <script language="javascript"> <!-- document.getElementById("#{id}").focus() //--> </script> 它大部分时间都能工作(如果没有人触摸屏幕/鼠标/键盘) 但是,当用户单击浏览器

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

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

它大部分时间都能工作(如果没有人触摸屏幕/鼠标/键盘)


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

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

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

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:


达林的答案是正确的,但在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>

var元素=document.getElementById('foo');
元素focus();
element.onblur=function(){
setTimeout(函数(){
元素focus();
}, 0);
};

但是,我强烈建议您不要这样做。在文本框外单击以从该文本框中移除焦点是完全正常的浏览器行为,这可能具有合法用途(例如,设置ctrl-F的搜索点,或启动拖动选择等)。不太可能有很好的理由来扰乱这种预期行为。

至少在Firefox或Chrome上不起作用;焦点通话需要推迟。
<input type="text" name="barcode" onblur="this.focus();" />
<input onblur="var that= this; setTimeout(function() { that.focus(); }, 0);">
<script type="text/javascript">
    var element= document.getElementById('foo');
    element.focus();
    element.onblur= function() {
        setTimeout(function() {
            element.focus();
        }, 0);
    };
</script>