PrimeFaces p:keyFilter在h:inputText Ajax更新后失效问题咨询
Hey there, I’ve dealt with this exact PrimeFaces issue before—let’s break down what’s going on and how to get your keyFilter working consistently again.
Why This Happens
When you run an Ajax update on your h:inputText, the original DOM element gets replaced with a fresh one. The p:keyFilter attaches its input-restriction listeners directly to the initial DOM element, so once that element is swapped out, the filter loses its connection and stops working.
Reliable Fixes to Try
Fix 1: Re-Initialize the KeyFilter After Ajax Completion
You can manually re-apply the keyFilter once the Ajax call finishes using PrimeFaces' widget system. First, assign a widgetVar to your keyFilter:
<p:keyFilter widgetVar="projectKeyFilter" target="projectKeyInput" regex="/[a-zA-Z0-9]/" />
(Replace projectKeyInput with the ID of your h:inputText)
Then add the oncomplete attribute to your Ajax component to trigger the re-initialization:
<p:ajax ... oncomplete="PF('projectKeyFilter').apply();" />
This tells PrimeFaces to re-bind the filter to the updated input element once the Ajax call is done.
Fix 2: Wrap Input + KeyFilter in an Updatable Container
Instead of updating just the h:inputText, wrap both the input and keyFilter in a container like h:panelGroup or p:outputPanel, and update that container instead. This way, the keyFilter gets re-rendered alongside the input, automatically binding to the new DOM element:
<h:panelGroup id="projectKeyContainer"> <h:inputText id="projectKeyInput" value="#{yourBean.projectKey}" /> <p:keyFilter target="projectKeyInput" regex="/[a-zA-Z0-9]/" /> </h:panelGroup> <!-- Update the container in your Ajax call --> <p:ajax ... update="projectKeyContainer" />
Fix 3: Switch to PrimeFaces' p:inputText
PrimeFaces' native input component integrates more smoothly with its own widgets. Replacing h:inputText with p:inputText often resolves these binding issues automatically, since it’s built to work with PrimeFaces' Ajax lifecycle:
<p:inputText id="projectKeyInput" value="#{yourBean.projectKey}"> <p:keyFilter regex="/[a-zA-Z0-9]/" /> </p:inputText>
Test It Out
After applying any of these fixes, verify using your original reproduction steps:
- First, focus directly on the "Project Key" input: special characters should still be blocked.
- Click "Project Name" then switch back to "Project Key": special characters should remain blocked, and the filter works as expected.
内容的提问来源于stack exchange,提问作者Shivani Bhansali

