Primefaces v3.5
在ajax请求结束时,尝试使用RequestContext.getContext().scrollTo("")
以编程方式滚动到我的表单。
XHTML片段:
<h:form id="genericMessagesForm">
<p:messages id="genericMessages" />
</h:form>
<p:commandButton id="testButton"
value="Test" process="#{cc.attrs.itemName}Final, @this"
actionListener="#{myBean.methodCalledByAjax()}" />
Bean:
public void methodCalledByAjax() {
List<String> updateTargets = new ArrayList<String>();
updateTargets.add("currentRecordForm");
updateTargets.add("genericMessagesForm");
RequestContext.getCurrentInstance().update(updateTargets);
RequestContext.getCurrentInstance().scrollTo("genericMessagesForm");
}
更新可以工作。
ScrollTo不起作用(ID相同!)。
没有引发服务器错误。
没有引发javascript控制台错误。
尝试过的浏览器:Firefox(最新版本)、Chrome(最新)、IE8。
您查看了文档吗?下面引用RequestContext#scrollTo()
javadoc:
滚动到
public abstract void scrollTo(String clientId)
ajax请求完成后滚动到某个组件。
参数:
clientId
—组件的客户端标识符。
看,它说的是客户端ID,而不是组件ID。同样有道理的是,滚动工作最终是由JavaScript通过document.getElementById()
和朋友完成的。这只适用于客户端ID。
对于那些还没有记住NamingContainer
的全部内容的初学者来说,一个简单的方法是通过右键单击查看JSF生成的HTML输出,在Web浏览器中查看源代码。
对于
<h:form id="genericMessagesForm">
<p:messages id="genericMessages" />
</h:form>
这就有点像
<form id="genericMessagesForm" ...>
<div id="genericMessagesForm:genericMessages" ...>
...
</div>
</form>
因此,相应地修复调用:
requestContext.scrollTo("genericMessagesForm:genericMessages");
顺便说一句,如果表单只包含<p:messages>
,那么您也可以完全去掉整个表单。<p:messages>
既不是EditableValueHolder
也不是ActionSource
组件,因此不需要放置在UIForm
组件中。这样你就可以继续使用你最初的尝试。
另请参阅:
- 如何找到ajax更新/渲染组件的客户端ID?找不到表达式为"的组件;foo";引用自";条"