如何组织多个需要 jQuery 和 jQuery 扩展的 portlet?
How to organise multiple portlets which require jQuery and jQuery extensions?
我正在为 Liferay 6.2 开发一些 portlet,并选择使用 jQuery 和一些扩展。
我似乎遇到了问题,因为我需要的扩展将自己附加到一个 jQuery 实例,而这不是我在 portlet 中使用的实例。所以当我使用扩展程序时它不可用。
我的代码看起来像这样。 liferay-portlet.xml
包含
<header-portlet-javascript>/js/jquery-1.12.2.min.js</header-portlet-javascript>
<header-portlet-javascript>/js/jquery-ui.min.js</header-portlet-javascript>
<header-portlet-javascript>/js/datepicker-de.js</header-portlet-javascript>
<header-portlet-javascript>/js/calendar.js</header-portlet-javascript>
在JSP
<script type="text/javascript">
var $CAL;
jQuery.noConflict();
jQuery( document ).ready(function( $ ) {
$CAL = jQuery; // create my own jQuery handle
...
$CAL.datepicker.setDefaults($CAL.datepicker.regional['de']);
// $CAL.datepicker is NULL !
});
</script>
我不确定,但我认为日期选择器函数附加到不同的 jQuery 实例。调试器列出了不同 portlet 正在加载的大约 7 个 jQuery 实例和 3 个 jQueryUI 实例。
经过一些研究,我们尝试加载主题中的所有 JS 库,但在主题之前加载了一些 portlet。我们目前的尝试是将它们加载到 'hook' 中。这仍在进行中。
目前我们正在自己创建所有 portlet。将来我们可能想要使用第 3 方 portlet,所以我想知道最好的方法是什么。
编辑
下面的答案和How to resolve two jquery conflict?
显示如何在加载多个 jQuery 时避免冲突。这是 Liferay portlet 开发中的最佳实践吗?我假设有时需要不同的 jQuery 版本是不可避免的,但是每个 portlet 简单地加载它自己的 jQuery 副本是否正常?
$CAL = jQuery
是问题所在。将 $CAL
定义为变量引用 jQuery.noConflict()
Create a different alias instead of jQuery to use in the rest of the
script.
var j = jQuery.noConflict();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script type="text/javascript">
$CAL = jQuery.noConflict();
$CAL(document).ready(function() {
$CAL.datepicker.setDefaults($CAL.datepicker.regional['de']);
console.log("jQuery version ", $CAL().jquery);
$CAL("body").datepicker("dialog", "10/14/2016");
});
</script>
我正在为 Liferay 6.2 开发一些 portlet,并选择使用 jQuery 和一些扩展。
我似乎遇到了问题,因为我需要的扩展将自己附加到一个 jQuery 实例,而这不是我在 portlet 中使用的实例。所以当我使用扩展程序时它不可用。
我的代码看起来像这样。 liferay-portlet.xml
包含
<header-portlet-javascript>/js/jquery-1.12.2.min.js</header-portlet-javascript>
<header-portlet-javascript>/js/jquery-ui.min.js</header-portlet-javascript>
<header-portlet-javascript>/js/datepicker-de.js</header-portlet-javascript>
<header-portlet-javascript>/js/calendar.js</header-portlet-javascript>
在JSP
<script type="text/javascript">
var $CAL;
jQuery.noConflict();
jQuery( document ).ready(function( $ ) {
$CAL = jQuery; // create my own jQuery handle
...
$CAL.datepicker.setDefaults($CAL.datepicker.regional['de']);
// $CAL.datepicker is NULL !
});
</script>
我不确定,但我认为日期选择器函数附加到不同的 jQuery 实例。调试器列出了不同 portlet 正在加载的大约 7 个 jQuery 实例和 3 个 jQueryUI 实例。
经过一些研究,我们尝试加载主题中的所有 JS 库,但在主题之前加载了一些 portlet。我们目前的尝试是将它们加载到 'hook' 中。这仍在进行中。
目前我们正在自己创建所有 portlet。将来我们可能想要使用第 3 方 portlet,所以我想知道最好的方法是什么。
编辑
下面的答案和How to resolve two jquery conflict? 显示如何在加载多个 jQuery 时避免冲突。这是 Liferay portlet 开发中的最佳实践吗?我假设有时需要不同的 jQuery 版本是不可避免的,但是每个 portlet 简单地加载它自己的 jQuery 副本是否正常?
$CAL = jQuery
是问题所在。将 $CAL
定义为变量引用 jQuery.noConflict()
Create a different alias instead of jQuery to use in the rest of the script.
var j = jQuery.noConflict();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script type="text/javascript">
$CAL = jQuery.noConflict();
$CAL(document).ready(function() {
$CAL.datepicker.setDefaults($CAL.datepicker.regional['de']);
console.log("jQuery version ", $CAL().jquery);
$CAL("body").datepicker("dialog", "10/14/2016");
});
</script>