Как отключить фокус для первого ввода в диалоговом окне "Перформансы"?

У меня есть Диалог на моей странице, который содержит поле ввода (Дата, Календарь). Проблема в том, что календарь открывается сразу после открытия диалога, потому что фокус установлен на первом входе.

Есть ли способ отключить фокус в Primefaces?

Ответ 1

Вы можете изменить поведение по умолчанию;

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 будет взята и использована вместо этого.

Я бы предложил создать файл js, такой как primefaces-overrides.js, и поместил бы что-то вроде этого внутри, один недостаток, хотя, поскольку вы кодируете низкоуровневую apis, вам нужно следить за регрессами во время миграций, хотя мы стремимся сохранить обратной совместимости, насколько мы можем.

Ответ 2

Что-то более простое можно было бы установить фокус по умолчанию в другом входе, которое у вас есть.

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

Если вы вызываете из другого файла

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

Ответ 3

Еще одна попытка исправить эту проблему:

Я добавил текстовый ввод в качестве первого ввода диалогового окна в моем диалоговом окне:

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

  <p:inputText id="fixForFocusProblem"/>

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

И при отображении диалога я вызываю это:

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

Таким образом, фокус попадает на входной текст, который сразу становится невидимым.

Не так приятно, но он работает без визуального беспокойства.

Ответ 4

Это также сделает:

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

Или прайс-листы jQuery

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

Ответ 5

добавьте этот script в ваш .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();
        }
    }