如何聚焦使用 p:ajax 更新的字段?
How to focus a field that was updated using p:ajax?
我的 PrimeFaces 应用程序有问题。
想象一个下拉菜单 (p:selectOneMenu
) 和一个键盘字段 (p:keyboard
)。
下拉是这样的:
<p:selectOneMenu
id="artikelUserAuswahl"
style="width: 80%;"
filter="true"
filterMatchMode="#{userBean.sucheMethodeArtikelKasse}"
value="#{kassenController.artikelNummerDropdown}"
disabled="#kassenController.tooMuch}"
onchange="$(function(){PrimeFaces.focus('formKasse:anzahl');});">
<f:selectItem
itemLabel="#{resourceUtils.getI18N('label.artikel.waehlen')}"
itemValue=""
itemDisabled="true"
noSelectionOption="true" />
<f:selectItems
value="#{kioskArtikelController.recordListIncludeSelected}"
var="ki"
itemLabel="#{ki.text}"
itemValue="#{ki.artikelNummer}"/>
<p:ajax
update=":formKasse :formKasse:artikelNummer :formKasse:anzahl :formKasse:preis
formKasse:artikelBeschreibung :formKasse:bestandVorhanden :formKasse:buttonAbschluss"
listener="#{kassenController.addArtikelDropdown}" />
<p:focus for="preis" />
</p:selectOneMenu>
我有 p:keyboard
字段:
<p:keyboard
id="#{userBean.kioskKasseUseNumpadPreis ? 'anzahl' :'anzahlNotRendered'}"
value="#{kassenController.anzahlAsString}"
layout="custom"
layoutTemplate="123,456,789,0.,back-close"
backspaceLabel="#{resourceUtils.getI18N('label.keyboard.backspace')}"
styleClass="kioskNumpadRabatt"
rendered="#{userBean.kioskKasseUseNumpadMenge}"
style="width: 80%; border: 2px solid #eeeeee !important;"
autocomplete="off"
disabled="#{kassenController.tooMuch}"
tabindex="2" />
请不要误会我的意思,在值、bean 和表单方面一切正常(一切都正确显示),但我遇到了这种奇怪的行为,如果我 select 一个值从下拉菜单中,键盘显示,但如果我点击一个数字(例如 PrimeFaces 键盘上的“1”),则它不会将其添加到输入字段,因为焦点并不在那里。
但是只要我手动点击 p:keyboard
字段,它就可以正常工作(问题:最终产品将 运行 在触摸屏显示器上)。
PrimeFaces 版本:6.0.
在这种情况下,焦点在 ajax 更新之前完成。因此 ajax 更新将在您设置焦点后触发。由于在此 ajax 调用中您还更新了刚刚设置焦点的字段,因此它将撤消设置此焦点。
解决方法是在 p:selectOneMenu
的 ajax 调用的 oncomplete 中设置焦点:
<p:ajax
update=":formKasse :formKasse:artikelNummer :formKasse:anzahl :formKasse:preis
formKasse:artikelBeschreibung :formKasse:bestandVorhanden :formKasse:buttonAbschluss"
listener="#{kassenController.addArtikelDropdown}"
oncomplete="$(function(){PrimeFaces.focus('formKasse:anzahl');});"
/>
我的 PrimeFaces 应用程序有问题。
想象一个下拉菜单 (p:selectOneMenu
) 和一个键盘字段 (p:keyboard
)。
下拉是这样的:
<p:selectOneMenu
id="artikelUserAuswahl"
style="width: 80%;"
filter="true"
filterMatchMode="#{userBean.sucheMethodeArtikelKasse}"
value="#{kassenController.artikelNummerDropdown}"
disabled="#kassenController.tooMuch}"
onchange="$(function(){PrimeFaces.focus('formKasse:anzahl');});">
<f:selectItem
itemLabel="#{resourceUtils.getI18N('label.artikel.waehlen')}"
itemValue=""
itemDisabled="true"
noSelectionOption="true" />
<f:selectItems
value="#{kioskArtikelController.recordListIncludeSelected}"
var="ki"
itemLabel="#{ki.text}"
itemValue="#{ki.artikelNummer}"/>
<p:ajax
update=":formKasse :formKasse:artikelNummer :formKasse:anzahl :formKasse:preis
formKasse:artikelBeschreibung :formKasse:bestandVorhanden :formKasse:buttonAbschluss"
listener="#{kassenController.addArtikelDropdown}" />
<p:focus for="preis" />
</p:selectOneMenu>
我有 p:keyboard
字段:
<p:keyboard
id="#{userBean.kioskKasseUseNumpadPreis ? 'anzahl' :'anzahlNotRendered'}"
value="#{kassenController.anzahlAsString}"
layout="custom"
layoutTemplate="123,456,789,0.,back-close"
backspaceLabel="#{resourceUtils.getI18N('label.keyboard.backspace')}"
styleClass="kioskNumpadRabatt"
rendered="#{userBean.kioskKasseUseNumpadMenge}"
style="width: 80%; border: 2px solid #eeeeee !important;"
autocomplete="off"
disabled="#{kassenController.tooMuch}"
tabindex="2" />
请不要误会我的意思,在值、bean 和表单方面一切正常(一切都正确显示),但我遇到了这种奇怪的行为,如果我 select 一个值从下拉菜单中,键盘显示,但如果我点击一个数字(例如 PrimeFaces 键盘上的“1”),则它不会将其添加到输入字段,因为焦点并不在那里。
但是只要我手动点击 p:keyboard
字段,它就可以正常工作(问题:最终产品将 运行 在触摸屏显示器上)。
PrimeFaces 版本:6.0.
在这种情况下,焦点在 ajax 更新之前完成。因此 ajax 更新将在您设置焦点后触发。由于在此 ajax 调用中您还更新了刚刚设置焦点的字段,因此它将撤消设置此焦点。
解决方法是在 p:selectOneMenu
的 ajax 调用的 oncomplete 中设置焦点:
<p:ajax
update=":formKasse :formKasse:artikelNummer :formKasse:anzahl :formKasse:preis
formKasse:artikelBeschreibung :formKasse:bestandVorhanden :formKasse:buttonAbschluss"
listener="#{kassenController.addArtikelDropdown}"
oncomplete="$(function(){PrimeFaces.focus('formKasse:anzahl');});"
/>