OmniFaces 突出显示未使用 <p:ajax> 设置焦点

OmniFaces highlight does not set focus with <p:ajax>

我得到了一个简单的登录表单。我正在使用 <p:ajax> 来调用 <p:blockUI>(参见 问题)。

<h:commandButton id="anmeldung_button"
action="#{benutzerAnmeldung.anmelden}" value="Anmelden"
styleClass="btn btn-info btn-sm">
    <p:ajax process="@form" update="@form"/>
</h:commandButton>
<p:blockUI id="block" block=":anmeldung" trigger="anmeldung_button" />

我正在使用 <o:highlight /> 来突出显示无效输入。这很好用。 它也与 <f:ajax> 完美配合。

显然,它不适用于 <p:ajax>

我怎样才能做到这一点?

这是由于 <p:ajax> 试图在 通过 doEval() 执行 oncomplete 脚本后 重新聚焦活动元素引起的(如在 handleReFocus() function in core.ajax.js script。但是,当您在输入中通过单击命令按钮而不是按 Enter 来提交表单时,该活动元素将成为命令按钮本身,而不是输入文本。您只需使用 Enter 键提交表单即可确认这一点。您会看到焦点设置正确。

在您的特定情况下,有 2 种方法可以解决此问题:

  1. 通过 <p:focus> 使用 PrimeFaces 自己的自动对焦功能,如下所示:

    <h:form id="anmeldung">
        <p:focus context="anmeldung" />
        ...
    </h:form>
    

    它还会自动考虑无效的输入字段。

  2. 在 JavaScript 中将 PrimeFaces.customFocus 设置为 true,这样 handleReFocus() 函数就不会工作了。

    <script>PrimeFaces.customFocus = true;</script>