如果在全页刷新 (FPR) 后未呈现文件,我如何有条件地在 h:head 中呈现 .js 文件?

Posted

技术标签:

【中文标题】如果在全页刷新 (FPR) 后未呈现文件,我如何有条件地在 h:head 中呈现 .js 文件?【英文标题】:How can I conditionally render .js file in h:head, if file was not rendered after Full Page Refresh (FPR)? 【发布时间】:2012-11-12 00:01:25 【问题描述】:

PrimeFaces 有条件地在 h:head 中呈现以下内容:

<script type="text/javascript" src="/webapp/javax.faces.resource/push/push.js.jsf?ln=primefaces"><!--//--></script>

当 PrimeFaces p:socket 组件被添加到 JSF/xhtml 页面时。我的一些页面刷新,导致此 push.js 文件“未”在 h:head 中呈现。

当 push.js 文件“未”呈现时,我想有条件地呈现 push.js 文件以尝试修复/解决我在使用 PrimeFaces Push 时遇到的问题。

更多详情请点击下方PrimeFaces论坛主题网址:

Uncaught TypeError: undefined is not a function

我问这个问题,是因为我已经在根据bean属性值有条件地渲染h:head了,比如下面这样:

<h:head rendered="#!pageNavigationController.gmaps and !pageNavigationController.gmapsAutoComplete">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta http-equiv="refresh" content="#session.maxInactiveInterval;url=pf_viewExpired.jsf" />
    <title><h:outputText escape="false" value="MCMS"/></title>
    <h:outputStylesheet name="css/mcms.css"/>
    <h:outputScript name="js/mcms.js"/>
    <h:outputScript name="js/addUsingTemplate.js"
                    rendered="#pageNavigationController.isPageSelected('/orders/pf_AddUsingTemplate.xhtml')"/>
</h:head>

也许我对 h:head 的使用使容器 TomEE 1.5 SNAPSHOT 难以为 .js 文件提供服务,因为页面上多个 h:head 的条件呈现,或者这实际上可能是 PrimeFaces Push ( Atmosphere) 问题最终需要解决,但我确信有一种方法可以通过 h:outputScript 渲染 .js 文件,如果该文件尚未在 h:head 中渲染。

Web 应用程序正在使用以下内容:

PrimeFaces 3.5 快照、TomEE 1.5 快照(Tomcat 7.0.32)、JUEL 2.2.5、OmniFaces 1.3 快照

请指教。

【问题讨论】:

这有什么帮助吗:showcase-omnifaces.rhcloud.com/showcase/components/… ? 如果在推送请求期间没有呈现&lt;h:head&gt;,那么这可以解释问题。我宁愿使用一个始终渲染的&lt;h:head&gt;,并将有条件渲染的子级包装在&lt;ui:fragment&gt; 中。试一试。 “可能”需要某种类型的加载脚本。我想我可能会尝试在我已经安装的登录/servlet 过滤器中处理这个问题。如果没有提供 .js 文件,则设置 usersController.pushJSFileServed = false;如果为 false,则 onload,我可以发出 AJAX 请求来提供 .js 文件并再次渲染 p:socket。 BalusC,如果我没记错的话,至少我的一个 h:head 总是被渲染。我的所有资源(js 和 css 文件)都被适当地渲染了;只是这个 push.js 文件并不总是在 h:head 中呈现,无论出于何种原因。不过我会试试你推荐的,谢谢。 @BalusC,我按照你的建议添加了一个 h:head,并用 ui:fragment 搜索并替换所有其他 h:head,并将所有 ui:fragment 移动到一个 h 中:头。经过测试的应用程序,仍然重复了这个问题。我很确定,如果我可以在 JS 文件未渲染时有条件地渲染它,那么应该可以解决/解决这个问题。 【参考方案1】:

这似乎更像是一个 PrimeFaces 问题。为了在同一视图上的每个请求上强制加载push.js,您可以显式添加一个

<h:outputScript library="primefaces" name="push/push.js" target="head" /> 

没有条件渲染。如果一切顺利,即它按照 JSF2 资源处理机制表现良好,那么在它正常工作的情况下根本不应该包含两次。

【讨论】:

以上是关于如果在全页刷新 (FPR) 后未呈现文件,我如何有条件地在 h:head 中呈现 .js 文件?的主要内容,如果未能解决你的问题,请参考以下文章

jquery刷新局部和全页的方法

转换事件后未呈现视图

部分视图刷新后未调用 JavaScript 函数

[Matplotlib FuncAnimation框架在添加新艺术家后未呈现

自定义 ViewGroup 中的视图在大小更改后未呈现

加载新页面后未呈现文本 - JQuery Mobile