使用Javascript确定JSF库资源
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用Javascript确定JSF库资源,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5002字,纯文字阅读大概需要8分钟。
内容图文
![使用Javascript确定JSF库资源](/upload/InfoBanner/zyjiaocheng/774/620f774955684344b84e6a327ac7a96c.jpg)
我是Primefaces Extensions项目的开发人员,我使用核心Primefaces JS函数在Javascript中为DocumentViewer和CKEditor组件获取资源的位置. getFacesResource()功能在PrimeFaces core.js中,看起来像这样..
/**
* Builds a resource URL for given parameters.
*
* @param {string} name The name of the resource. For example: primefaces.js
* @param {string} library The library of the resource. For example: primefaces
* @param {string} version The version of the library. For example: 5.1
* @returns {string} The resource URL.
*/
getFacesResource : function(name, library, version) {
// just get sure - name shoudln't start with a slash
if (name.indexOf('/') === 0)
{
name = name.substring(1, name.length);
}
var scriptURI = $('script[src*="/' + PrimeFaces.RESOURCE_IDENTIFIER + '/core.js"]').attr('src');
// portlet
if (!scriptURI) {
scriptURI = $('script[src*="' + PrimeFaces.RESOURCE_IDENTIFIER + '=core.js"]').attr('src');
}
scriptURI = scriptURI.replace('core.js', name);
它的作用是在DOM中找到“core.js”脚本,然后删除core.js,使其具有您为查找资源而构建的新URL的正确位置.
为什么我们需要这样做?
CKEDitor和DocumentViewer组件是复杂的组件,可以加载大量插件,语言文件等.我们不能修改这些插件每次升级时使用的核心JS文件,我们必须编辑它们的核心源.因此,对于DocumentViewer加载语言包,库值具有“documentviewer / locale / en-GB.locale.txt”来加载DocumentViewer使用的PDF.js的英语语言包.然而,这需要成为一个真正的资源,所以PrimeFaces.getFacesResource(‘documentviewer / locale / en-GB.locale.txt’);将URL转换为PDF.JS代码可以找到的适当资源,例如:
https://www.primefaces.org/showcase-ext/javax.faces.resource/documentviewer/locale/en-GB.locale.txt.jsf?ln=primefaces-extensions&v=6.2.5
它处理知道完整的URL,附加库版本并知道当前服务器是否正在服务.jsf或.xhtml扩展等.
问题:
我使用OmniFaces CombinedResourceHandler获取所有JS文件,并从它找到的所有JS文件创建1个单独的脚本.所以10个不同的JS文件现在成为这样的1个性能资源……
/javax.faces.resource/XXX.js.xhtml?ln=omnifaces.combined&v=1532916484000
现在这打破了核心PrimeFaces代码,因为它无法查找core.js,因为页面上不再存在core.js.
我尝试将core.js排除在使用此开关组合之外.
<context-param>
<param-name>org.omnifaces.COMBINED_RESOURCE_HANDLER_EXCLUDED_RESOURCES</param-name>
<param-value>primefaces:core.js</param-value>
</context-param>
在omnifaces.combined.js打破整个页面之后加载PrimeFaces core.js.要确认输出是这个……
<script src="/primeext-showcase/javax.faces.resource/XXX.js.jsf?ln=omnifaces.combined&v=1533319992000"></script>
<script src="/primeext-showcase/javax.faces.resource/core.js.jsf?ln=primefaces&v=6.2">
所以我的问题是如何使用纯JavaScript来替换/修复PrimeFaces.getFacesResource()JS函数,以便OmniFaces是否合并了脚本?
解决方法:
我能够重写方法,不假设在页面上使用正则表达式找到了core.js.它现在在PrimeFaces处于正常模式时有效,并且如果使用OmniFaces CombinedResourceHandler则可以工作.我将把它作为补丁提交给PrimeFaces.
这是最终的工作方法:
/**
* Builds a resource URL for given parameters.
*
* @param {string}
* name The name of the resource. For example: primefaces.js
* @param {string}
* library The library of the resource. For example: primefaces
* @param {string}
* version The version of the library. For example: 5.1
* @returns {string} The resource URL.
*/
getFacesResource : function(name, library, version) {
// just get sure - name shoudln't start with a slash
if (name.indexOf('/') === 0) {
name = name.substring(1, name.length);
}
// find any JS served JSF resource
var scriptURI = $('script[src*="/' + PrimeFaces.RESOURCE_IDENTIFIER + '/"]').first().attr('src');
// portlet
if (!scriptURI) {
scriptURI = $('script[src*="' + PrimeFaces.RESOURCE_IDENTIFIER + '="]').first().attr('src');
}
// find script...normal is '/core.js' and portlets are '=core.js'
var scriptRegex = new RegExp('\/' + PrimeFaces.RESOURCE_IDENTIFIER + '(\/|=)(.*?)\.js');
// find script to replace e.g. 'core.js'
var currentScriptName = scriptRegex.exec(scriptURI)[2] + '.js';
// replace core.js with our custom name
scriptURI = scriptURI.replace(currentScriptName, name);
// find the library like ln=primefaces
var libraryRegex = new RegExp('[?&]([^&=]*)ln=(.*?)(&|$)');
// find library to replace e.g. 'ln=primefaces'
var currentLibraryName = 'ln=' + libraryRegex.exec(scriptURI)[2];
// In a portlet environment, url parameters may be namespaced.
var namespace = '';
var urlParametersAreNamespaced = !(scriptURI.indexOf('?' + currentLibraryName) > -1 || scriptURI.indexOf('&'
+ currentLibraryName) > -1);
if (urlParametersAreNamespaced) {
namespace = new RegExp('[?&]([^&=]+)' + currentLibraryName + '($|&)').exec(scriptURI)[1];
}
// If the parameters are namespaced, the namespace must be included
// when replacing parameters.
scriptURI = scriptURI.replace(namespace + currentLibraryName, namespace + 'ln=' + library);
if (version) {
var extractedVersion = new RegExp('[?&]' + namespace + 'v=([^&]*)').exec(scriptURI)[1];
scriptURI = scriptURI.replace(namespace + 'v=' + extractedVersion, namespace + 'v=' + version);
}
var prefix = window.location.protocol + '//' + window.location.host;
return scriptURI.indexOf(prefix) >= 0 ? scriptURI : prefix + scriptURI;
},
内容总结
以上是互联网集市为您收集整理的使用Javascript确定JSF库资源全部内容,希望文章能够帮你解决使用Javascript确定JSF库资源所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。