13

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

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

4

5 回答 5

18

您可以更改默认行为;

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 进行编码,您需要在迁移期间注意回归,尽管我们的目标是保持向后兼容性尽我们所能。

于 2013-04-02T22:16:15.200 回答
7

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

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

如果您从另一个文件调用

<p:dialog id="dialog" header="Users" focus="savebtn" widgetVar="formRegUsers:txtName">
于 2017-06-02T18:06:36.903 回答
2

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

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

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

  <p:inputText id="fixForFocusProblem"/>

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

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

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

这样,焦点就放在了立即不可见的输入文本上。

不太好,但它可以在没有视觉干扰的情况下工作。

于 2013-11-25T16:24:08.550 回答
0

这也可以:

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

或者 Primefaces jQuery

<p:dialog onShow="jQuery(document.activeElement).blur()" ...>
于 2013-11-29T12:02:20.027 回答
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();
        }
    }
于 2016-02-01T11:07:59.383 回答