如何在Primefaces对话框中禁用第一个输入的焦点?

时间:2013-04-02 10:02:14

标签: jsf primefaces dialog focus

我的页面中有一个对话框,其中包含一个输入字段(日期,日历)。问题是打开对话框后日历会立即打开,因为焦点是在第一个输入上设置的。

有没有办法在Primefaces中禁用焦点?

5 个答案:

答案 0 :(得分:16)

您可以更改默认行为;

http://forum.primefaces.org/viewtopic.php?f=3&t=29050

您始终可以覆盖窗口小部件的默认行为,例如,防止日历关注于对话框打开;

PrimeFaces.widget.Dialog.prototype.applyFocus = function() {
  var firstInput = this.jq.find(':not(:submit):not(:button):input:visible:enabled:first');
  if(!firstInput.hasClass('hasDatepicker')) {
      firstInput.focus();
  }
}

原始代码是;

PrimeFaces.widget.Dialog.prototype.applyFocus = function() {
  this.jq.find(':not(:submit):not(:button):input:visible:enabled:first').focus();
}

如果你在PrimeFaces资源之后放置你的覆盖,那么你的applyFocus实现将被选中并改为使用。

我建议创建一个像primefaces-overrides.js这样的js文件,并把这样的东西放在里面,虽然因为你是针对低级api进行编码的一个缺点,但你需要注意迁移过程中的回归,尽管我们的目标是保持我们尽可能向后兼容。

答案 1 :(得分:4)

默认情况下,您可以在另一个输入中设置更简单的焦点。

<p:dialog id="dialog" header="Users" focus="savebtn" widgetVar="txtName">

如果您使用其他文件进行呼叫

<p:dialog id="dialog" header="Users" focus="savebtn" widgetVar="formRegUsers:txtName">

答案 2 :(得分:1)

解决此问题的另一个技巧:

我在对话框中添加了一个文本输入作为对话框的第一个输入:

<p:dialog id="myDialogId" widgetVar="myDialog"....

  <p:inputText id="fixForFocusProblem"/>

  <p:calendar ...
  ..
</p:dialog>

在显示对话框时,我称之为:

$('#myForm\\:fixForFocusProblem').show();
myDialog.show(); 
$('#myForm\\:fixForFocusProblem').hide();

通过这种方式,焦点会立即显示在输入文本上。

不太好但是它在没有视觉干扰的情况下起作用。

答案 3 :(得分:0)

这也可以:

<p:dialog onShow="$(document.activeElement).blur()" ...>

或Primefaces jQuery

<p:dialog onShow="jQuery(document.activeElement).blur()" ...>

答案 4 :(得分:0)

在.xhtml中添加此脚本:

    PrimeFaces.widget.Dialog.prototype.applyFocus = function () {
        var firstInput = this.jq.find(':not(:submit):not(:button):input:visible:enabled:first');
        if (!firstInput.hasClass('hasDatepicker')) {
            firstInput.focus();
        }
    }