5

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

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

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

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

4

3 回答 3

10

Darin 的答案是正确的,但在 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 设置搜索点,或开始拖动选择等)。不太可能有充分的理由来搞乱这种预期的行为。

于 2010-04-09T08:53:00.467 回答
2
<input type="text" name="barcode" onblur="this.focus();" />
于 2010-04-09T08:31:15.690 回答
1

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

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

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();
    }
}
于 2010-04-09T08:31:03.933 回答