<p:layout>
和一个带有<p:watermark>
和<p:fileUpload>
表单的测试页面上,它看起来像下面这样...<p:layout>
<p:layoutUnit position="west" size="100">Test</p:layoutUnit>
<p:layoutUnit position="center">
<h:form enctype="multipart/form-data">
<p:inputText id="input" />
<p:watermark for="input" value="watermark" />
<p:focus for="input" />
<p:fileUpload/>
<p:commandButton value="submit" />
</h:form>
</p:layoutUnit>
</p:layout>
...它列出了以下可能可以延迟加载的JavaScript文件:
primefaces.js
(219.5KiB)jquery-plugins.js
(191.8KiB)jquery.js
(95.3KiB)layout.js
(76.4KiB)fileupload.js
(23.8KiB)watermark.js
(4.7KiB)
它链接到这篇Google Developers文章,其中解释了延迟加载以及如何实现它。基本上,您需要在window
的onload
事件期间动态创建所需的<script>
。最简单的形式是完全忽略旧版本和有缺陷的浏览器,看起来像这样:
<script>
window.addEventListener("load", function() {
var script = document.createElement("script");
script.src = "filename.js";
document.head.appendChild(script);
}, false);
</script>
好的,如果您可以控制这些脚本,那么这是可行的,但列出的脚本都是JSF强制自动包含的。此外,PrimeFaces将一堆内联脚本呈现为HTML输出,这些脚本直接从
jquery.js
中调用$(xxx)
和从primefaces.js
中调用PrimeFaces.xxx()
。这意味着它不容易真正推迟它们到onload
事件,因为您最终只会遇到像$ is undefined
和PrimeFaces is undefined
这样的错误。
但是,从技术上讲应该是可能的。考虑到只有jQuery不需要延迟,因为站点的许多自定义脚本也依赖于它,我如何阻止JSF强制自动包含PrimeFaces脚本以便我可以推迟它们,并且我如何处理那些内联的PrimeFaces.xxx()
调用?
CDNResourceHandler
檢索的資源也可以在web.xml
中標記為延遲加載嗎? - djmj<h:outputScript library="js" name="primefaces.deferred.min.js" target="head" /> <o:deferredScript group="essential" library="primefaces" name="jquery/jquery-plugins.js" /> <o:deferredScript group="essential" library="primefaces" name="core.js" onbegin="DeferredPrimeFaces.begin()" /> <o:deferredScript group="essential" library="primefaces" name="components.js" onsuccess="DeferredPrimeFaces.apply()" />
- codyLine