0

我的目标是确保同一个组件始终具有焦点。该表单有一个输入框和许多按钮。用户将扫描条形码(使用模拟键盘的扫描仪),然后选择一个按钮来激活一个功能。我希望他们能够扫描多个条形码,而无需单击输入框。我有以下 javascript 来完成准备收件箱以进行覆盖的肮脏工作(目前只有当他们将焦点移到收件箱时)。

function SelectAll(id)
    {
        document.getElementById(id).focus();
        document.getElementById(id).select();
    }
    window.onload = SelectAll('form:scan');

我需要让输入畅通无阻(因此认为它应该只在失去焦点时才返回焦点)。我已经尝试添加功能来聚焦更改和按钮激活事件,但没有成功。确实需要使其页面宽,因为在按钮激活后焦点转到未知的地方。

编辑

在这种情况下,似乎对模糊事件进行焦点更改不起作用。看起来 JSF 的处理程序在执行模糊事件(以及因此的焦点更改请求)之后移动焦点。任何 JSF 专家都知道如何进入 JSF 的处理程序并对其进行调整,而不是尝试使用纯 JavaScript 来完成?

编辑

我是其中的一部分。模糊事件被忽略的原因与在 AJAX 调用期间重新渲染整个表单有关,而不仅仅是单个组件。限制更新范围使其适用于所有组件,除了输入框本身。我需要输入框本身重新渲染,因为它对输入进行了一些验证。如果我禁用它的重新渲染,它将在输入时选择。如果我启用重新渲染,则选择代码会在重新输入验证信息之前运行。当信息重新输入时,选择会丢失(保持焦点,但如果没有选择,我们无法立即再次扫描,需要点击某处)。

4

1 回答 1

1

试试这个,很确定窗口加载在 jsfiddle 中不起作用

http://jsfiddle.net/jemZT/

var scannerID = document.getElementById("scannerID");
function startFocus(){
    scannerID.focus();
}
if(window.addEventListener){
    window.addEventListener('load',startFocus,false); //W3C
}
else{
    window.attachEvent('onload',startFocus); //IE
}
scannerID.addEventListener("blur", function(e){
    e.target.focus();
});​

它们也是用于复制和粘贴的事件,以便在您单击标签时轻松将其复制到剪贴板,您可能会感兴趣,使复制和粘贴代码的过程更简单。

编辑:确认和工作我在我的浏览器中尝试了这个,它工作得很好。

<html>
<body>
<input type="text" id="scannerID" />
<script type="text/javascript">
var scannerID = document.getElementById("scannerID");
if(window.addEventListener){
    window.addEventListener('load',startFocus,false); //W3C
}else{
    window.attachEvent('onload',startFocus); //IE
}
function startFocus(){
    scannerID.focus();
}
scannerID.addEventListener("blur", function(e){
    e.target.focus();
});
</script>
</body>
</html>
于 2012-09-06T13:52:58.970 回答