H: commandbutton vs h: commandlink
Мы используем JSF-2.1.7 и во всех наших почтовых запросах формы. Я пытаюсь оправдать использование <h:commandButton>
или <h:commandLink>
. Внешний вид <h:commandLink>
(href <a/>
) можно контролировать с помощью стиля и jQuery.
Что рекомендуется <h:commandButton>
или <h:commandLink>
? Есть ли реальные преимущества?
Ответы
Ответ 1
Функциональная разница не отличается от сгенерированной разметки и внешнего вида. <h:commandButton>
генерирует элемент HTML <input type="submit">
, а <h:commandLink>
генерирует элемент HTML <a>
, который использует JavaScript для отправки формы. Оба должны использоваться для отправки формы. Дополнительный стиль не имеет отношения к функциональности.
Используйте <h:commandButton>
, если вам нужна кнопка отправки и используйте <h:commandLink>
, если вам нужна ссылка . Если это не имеет смысла для вас, то я не знаю. Если вы не можете решить, какой из них использовать, просто выберите тот, который имеет наибольший смысл в перспективе пользовательского интерфейса. Спросите веб-дизайнера, если вы не уверены.
Различие между <h:commandLink>
и <h:outputLink>
, кстати, более интересно. Здесь подробно дается ответ: Когда следует использовать h: outputLink вместо h: commandLink?
Ответ 2
Для формы я предпочитаю h: commandbutton
h: commandbutton похож на кнопку в HTML, где вы можете установить действие поддержки bean.
h: commandlink похожа на ссылку в HTML (тег a), где вы также можете установить действие поддержки bean
Чтобы использовать стиль css в JSF, вы можете использовать атрибут 'styleClass'.
Ответ 3
Короче говоря, моя рекомендация представляет собой сочетание <h:commandButton type="submit">
для основной (по умолчанию) кнопки отправки и <h:commandLink>
для любых дополнительных кнопок (например, фильтра, сортировки, поиска, предварительного просмотра, генерации пароля,...).
Далее следует длинное объяснение:
Во-первых, некоторый фон: нужно, вероятно, также знать разные атрибуты <h:commandButton>
type
. (Атрибут type
преобразуется непосредственно в сгенерированный атрибут <input type="">
.) Я не нашел это явно сформулированным в любом месте, но некоторые тесты показали, что:
-
type="submit"
(по умолчанию это опущено) выполняет обычное "представление" поведения формы (т.е. POSTing формы), а также action
и/или actionListener
.
-
type="reset"
выполняет обычное поведение "reset" (т.е. очистка/сброс полей формы) без, вызывающего любые action
и/или actionListener
s.
-
type="button"
генерирует кнопку (видимо, <input type="button">
немного более ограничен, чем тег <button>
) без, вызывающий любые action
и/или actionListener
s.
Помимо сброса полей, последние два, по-видимому, полезны только для активации, например. Javascript. Они не отправляют форму.
Итак, чтобы ответить на вопрос: в контексте формы:
-
<h:commandButton>
(что эквивалентно <h:commandButton type="submit">
, помните) часто является наиболее полезным, особенно когда большинство браузеров реализуют активацию первой кнопки отправки, найденной в дереве DOM формы при нажатии Enter. Это может улучшить пользовательский интерфейс вашей формы.
например. он несколько быстрее регистрируется с помощью:
- Имя пользователя Tab Пароль Enter
в отличие от
- Имя пользователя Tab Пароль... перемещайте руку с клавиатуры на мышь, указатель поиска и позицию на кнопке, нажмите.
Также имейте в виду, что любые кнопки <input>
(необязательно в стиле CSS) по-прежнему могут быть достигнуты с помощью клавиатуры Tab до тех пор, пока <a>
(CSS-стиль в виде кнопки) не будет сфокусирован, а затем Spacebar.
- Однако для дополнительных кнопок в форме, которые должны выполнять некоторые другие действия вместо отправки (или "просто" очистки полей),
<h:commandLink>
будет более уместным. Этого можно достичь с помощью клавиатуры Tab до тех пор, пока <a>
(в стиле CSS как кнопка) не будет сфокусирован, а затем Enter. Примечание, что это несовместимо с кнопками, сгенерированными с помощью <h:commandButton>
, которые могут выглядеть в стиле CSS одинаково, но браузером они обрабатываются по-разному (Tab... Spacebar).
Это общее объяснение, , но есть некоторые проблемы, которые вы, возможно, захотите принять к сведению...
Если у вас нет кнопки <h:commandButton type="submit">
в форме, только кнопка <h:commandLink>
(или даже никаких кнопок вообще), когда пользователь нажимает Enter, форма все еще отправляется, но без преимущества a action{Listener}
. Что может быть не слишком большой проблемой, так как значения формы сохраняются в резервном хранилище bean и отображаются снова при загрузке страницы, поэтому, кроме серверного обратного вызова, пользователь часто не замечает, что что-то не так. Но это может быть не так, как вы хотите обрабатывать Enter. Единственный способ, о котором я могу думать в данный момент обойти это, - разместить событие onSubmit
в форме, которая активирует вашу кнопку <h:commandLink>
по умолчанию через Javascript.... Arghhhh!!
Вы также должны убедиться, что ваши селектор стиля CSS звучат.
-
A.mystyle
применяется к <h:commandLink>
;
-
INPUT[type=submit].mystyle
- <h:commandButton type="submit">
;
-
INPUT[type=reset].mystyle
- <h:commandButton type="reset">
;
-
INPUT[type=button].mystyle
to <h:commandButton type="button">
;
Конечно, они могут быть объединены с запятой в качестве селектора для определения одного стиля. Или, если вы хотите рисковать тем, что что-то еще называется стилистикой, вы можете опустить спецификаторы A
/INPUT
. Тем не менее, я стилизовал свои кнопки, как указано выше, чтобы я мог также использовать это:
-
SPAN.mystyle
определение, когда ссылка или кнопка отключена (например, с помощью атрибута disabled
) - это позволяет вам отображать отключенную кнопку (greyed) для отключенной кнопки.
Я также столкнулся с некоторыми различиями в высоте (высота строки на кнопке по сравнению с высотой контента в Link - что может быть проблемой, если ваша кнопка включает фоновое изображение в качестве значка вместо текста), а также некоторые незначительные отличия в том, как :before
/:after
обрабатываются псевдоклассы. Все, что я говорю: протестируйте и повторите проверку CSS на <h:commandButton>
и <h:commandLink>
, чтобы убедиться, что они выглядят (по существу) одинаковыми!
Вот мой итоговый чит-лист:
JSF <h:commandButton <h:commandButton <h:commandButton <h:commandLink>
type="submit"> type="reset"> type="button">
Translates to <input <input <input <a>
type="submit"> type="reset"> type="button">
Submit form POST no, clears flds no POST
Javascript events YES YES YES YES
action{Listener} YES no no YES
Enter on form activates YES no no no
Tab...+Enter activates YES(*) YES YES YES
Tab...+Space activates YES(*) YES YES no
Highlight on Tab-focus:
- Firefox 32 YES no no no
- Chrome 41 YES YES YES YES
- Internet Explorer 11 YES YES YES YES
- Opera 28 YES YES YES no(*)
(*=Opera 28 seems not to allow tabbing (or Alt+Arrow) to hyperlinks to activate them.)
Ответ 4
Исправьте меня, если я ошибаюсь, но первое различие между этими двумя заключается в том, что <h:commandButton>
не требуется, чтобы JavaScript был включен в браузере. Если ваша веб-страница JS тяжелая, вы можете использовать <h:commandLink>
, иначе было бы лучше оставить ее JS бесплатно, если ваш пользователь захочет использовать sth, например Tor Browser, и вы в порядке с ним.
Во-вторых, как эти два будут вести себя на веб-странице. <h:commandLink>
будет делать то, что он должен делать, а иногда также запускать метод из @PostConstruct.
В то время как <h:commandButton>
может также запускать встроенные Java-скрипты, которые могут привести к запуску других методов из резервной копии bean. Однако он также автоматически обновит представление.