如何强制函数在任何焦点更改时运行?

时间:2012-09-06 13:23:28

标签: javascript jsf

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

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

我需要允许输入不受阻碍(因此认为它应该只在焦点丢失时返回焦点)。我已经尝试添加功能来集中更改和按钮激活事件,但没有成功。真的需要让它在页面范围内看起来似乎焦点在按钮激活后变得不知道。

修改

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

修改

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

1 个答案:

答案 0 :(得分: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>