[英]How can I load multiple versions of a jQuery plugin on the same page?
我正在尝试将最新版本的timepicker插件用于jQuery UI。
另一个库已经以较早的版本( 1.0.4
)加载了它,但是我想使用最新的( 1.4.5
)版本。
在源代码中 ,插件会在继续操作之前检查它是否已经加载:
$.ui.timepicker = $.ui.timepicker || {};
if ($.ui.timepicker.version) {
return;
}
我做了很多寻找方法的尝试,但没有提出任何有用的建议。 我确实看到,可以使用noConflict
在页面上加载多个版本的jQuery,然后将其附加到其他版本的jQuery,但是我认为应该有一种更简单的方法。
我试了一下,它不起作用-我认为是因为变量被引用了,所以可能需要实例化它们-我不是JS专家,但至少我正在尝试:
// jQuery, jQueryUi, and the 1.0.4 version loaded beforehand
<script>
var _old_jquery_ui_timepicker = jQuery.ui.timepicker;
var _old_jquery_ui_timepicker_function = jQuery.fn.datetimepicker;
jQuery.ui.timepicker = null;
</script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-ui-timepicker-addon/1.4.5/jquery-ui-timepicker-addon.min.js"></script>
<script>
jQuery.ui.mytimepicker = jQuery.ui.timepicker;
jQuery.ui.timepicker = _old_jquery_ui_timepicker;
jQuery.fn.mydatetimepicker = jQuery.fn.datetimepicker;
jQuery.fn.datetimepicker = _old_jquery_ui_timepicker_function;
</script>
编写该代码感到很肮脏,并且再次无效。 因此,在没有任何运气之后,我尝试进行更多搜索,但仍然没有提出任何建议。 我尝试搜索:
这是简单的事情,我只是不搜索或做对的事情,还是不可能?
我需要更新版本的时间选择器中的功能,但是我不希望在更新或替换其他库时代码中断。
1.0.4
)的大型代码库。 1.0.4
)的代码,就像依赖其他代码库加载较旧的版本一样(更新时可能会中断) 因此,我同意使用两个版本的jQuery插件并不理想。 但是,我确实需要从更高版本的jQuery timepicker插件中添加功能。 我相信可以做到这一点,也许可以使用Javascript的原型设计和继承,而不必像@ Oliboy50建议的那样对插件的源代码进行查找和替换而对其进行“黑客攻击” 。
请注意:是的,我们已经确定尝试这样做是“一个坏主意”,但是原则上我想知道Javascript的原型语言是否允许这样做。 在评论和答案中已经提到了noconflict
(即加载多个版本的jQuery)。 尽管这“行得通”,但这不是我要找的答案。 同样,用查找和替换修改插件源代码也不是一个好的解决方案。
我认为使用两种不同版本的插件已经是一件坏事了。 因此,我认为您不介意解决方案是否是更改插件的名称。
在这个jsfiddle( http://jsfiddle.net/RVyKM/ )中,我将timepicker
为timepickertwo
并将datetimepicker
替换为datetimepickertwo
。 因此,您既可以使用旧的时间选择器插件版本1.0.4,也可以使用新的时间选择器插件版本1.4.5 ...
但是,请注意,这是一个坏主意,恕我直言。
这似乎是不可能的,尤其是对于此插件。 首先,该插件不允许自己重新定义/覆盖:
/*
* Lets not redefine timepicker, Prevent "Uncaught RangeError: Maximum call stack size exceeded"
*/
$.ui.timepicker = $.ui.timepicker || {};
if ($.ui.timepicker.version) {
return;
}
因此,您不能简单地加载较旧的版本,对其进行初始化,然后在较旧的版本之上加载较新的版本,就不会加载较新的版本。
其次,如果插件是通过RequireJS在单独的上下文中加载的,则它在jQuery ui小部件上没有句柄。 换句话说,您可以引入插件并将其附加到单独的jQuery实例,但是jquery ui仅将一个全局div
用于datepicker,并且单独的实例不起作用。 我整理了以下示例(请参阅完整的jsfiddle ):
HTML
<script src="http://rawgit.com/trentrichardson/jQuery-Timepicker-Addon/v1.0.4/jquery-ui-timepicker-addon.js"></script>
<p><input id="date1" type="text" /></p>
<p><input id="date2" type="text" /></p>
<p><input id="date3" type="text" /></p>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
使用Javascript
require.config({
paths: {
'jquery': '//cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min',
'jquery-ui': 'http://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min',
'jquery.timepicker': 'http://rawgit.com/trentrichardson/jQuery-Timepicker-Addon/v1.4.5/dist/jquery-ui-timepicker-addon'
},
shim: {
'jquery.timepicker': {
deps: ['jquery', 'jquery-ui'],
init: function(jquery) {
return jquery.noConflict(true);
}
}
},
});
QUnit.test('global timepicker is 1.0.4', function (assert) {
assert.ok($.timepicker.version == '1.0.4',
$.timepicker.version);
});
$('#date1').timepicker();
require(['jquery', 'jquery.timepicker'], function ($) {
QUnit.test('amd timepicker is 1.4.5', function (assert) {
assert.ok($.timepicker.version == '1.4.5',
$.timepicker.version);
});
// Not working...
$('#date2').datepicker();
});
setTimeout(function() {
QUnit.test('global timepicker is still 1.0.4', function (assert) {
assert.ok($.timepicker.version == '1.0.4',
$.timepicker.version);
});
$('#date3').timepicker();
}, 2000);
我可以看到的唯一解决方案是@ Oliboy50建议的方法,克隆源并重命名插件。
编辑
嗯...也许这行得通( 小提琴 ):
// Maybe working...
$.datepicker = jQuery.datepicker;
$.fn.datepicker = jQuery.fn.datepicker;
$('#date2').timepicker();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.