使用附加功能/覆盖功能扩展 jQuery 插件
Extend jQuery Plugin with additional function / override function
我需要扩展一个 jQuery 插件 (https://github.com/idiot/unslider),以便使用另一个 public 方法添加额外的行为。
(function(){
// Store a reference to the original remove method.
var originalMethod = $.fn.unslider;
// Define overriding method.
$.fn.unslider = function(){
// Execute the original method.
originalMethod.apply( this, arguments );
console.log( "Override method" );
function test() {
console.log("test called");
}
this.each(function() {
// Operations for each DOM element
console.log("each dom element?");
}).data('unslider', {
// Make test accessible from data instance
test: test
});
return this;
}
})(jQuery);
我已经设法使 public 方法在调用
时可访问
var slider = $('#slider');
slider.data('unslider').test();
但是,无论如何,我想保留 unslider 的旧行为,但用另一个功能扩展插件。有人有想法吗?
我创建了一个 fiddle,所以你可以检查发生了什么:
我的新函数被调用,但旧的函数已经消失:
http://jsfiddle.net/b2os4s7e/1/
只需定义:
$fn.unslider2 = function() { ... }
任何你喜欢的名字和行为。
扩展 JQuery 应该使用 .fn.extend
(function($){
$.fn.extend({
helloworld: function(message){
return this.each(function(){
$(this).click(function(){
alert(message);
});
});
}
});
})(jQuery)
对象 .fn.extend
用于 jQuery
的扩展功能
如果你查看 unslider 的源代码,你可以看到它在数据中存储了 Unslider 实例:
// Enable multiple-slider support
return this.each(function(index) {
// Cache a copy of $(this), so it
var me = $(this),
key = 'unslider' + (len > 1 ? '-' + ++index : ''),
instance = (new Unslider).init(me, o);
// Invoke an Unslider instance
me.data(key, instance).data('key', key);
});
在您的代码中,您正在用自己的对象覆盖此对象。但是,滑块需要有一个 Unslider 实例。所以你想要做的是得到这个实例,然后用你自己的函数扩展它:
var key = $(this).data('key');
var obj = $(this).data(key);
obj.test = function() { console.log('Working!'); };
感谢您的回答!我是这样做的:
(function($){
var originalMethod = $.fn.unslider;
$.fn.extend({
unslider: function(o) {
var len = this.length;
var applyMethod = originalMethod.apply( this, arguments );
var key = applyMethod.data('key');
var instance = applyMethod.data(key);
// Cache a copy of $(this), so it
var me = $(this);
if (instance) {
instance.movenext = function (callback) {
return instance.stop().to(instance.i + 1, callback);
};
instance.moveprev = function (callback) {
return instance.stop().to(instance.i - 1, callback);
};
}
return applyMethod.data(key, instance);
}
});
})(jQuery)
关键是按照 sroes 的建议处理数据属性。
此外,我需要应用原始方法,因为我需要旧方法。
我需要扩展一个 jQuery 插件 (https://github.com/idiot/unslider),以便使用另一个 public 方法添加额外的行为。
(function(){
// Store a reference to the original remove method.
var originalMethod = $.fn.unslider;
// Define overriding method.
$.fn.unslider = function(){
// Execute the original method.
originalMethod.apply( this, arguments );
console.log( "Override method" );
function test() {
console.log("test called");
}
this.each(function() {
// Operations for each DOM element
console.log("each dom element?");
}).data('unslider', {
// Make test accessible from data instance
test: test
});
return this;
}
})(jQuery);
我已经设法使 public 方法在调用
时可访问var slider = $('#slider');
slider.data('unslider').test();
但是,无论如何,我想保留 unslider 的旧行为,但用另一个功能扩展插件。有人有想法吗?
我创建了一个 fiddle,所以你可以检查发生了什么: 我的新函数被调用,但旧的函数已经消失: http://jsfiddle.net/b2os4s7e/1/
只需定义:
$fn.unslider2 = function() { ... }
任何你喜欢的名字和行为。
扩展 JQuery 应该使用 .fn.extend
(function($){
$.fn.extend({
helloworld: function(message){
return this.each(function(){
$(this).click(function(){
alert(message);
});
});
}
});
})(jQuery)
对象 .fn.extend
用于 jQuery
如果你查看 unslider 的源代码,你可以看到它在数据中存储了 Unslider 实例:
// Enable multiple-slider support
return this.each(function(index) {
// Cache a copy of $(this), so it
var me = $(this),
key = 'unslider' + (len > 1 ? '-' + ++index : ''),
instance = (new Unslider).init(me, o);
// Invoke an Unslider instance
me.data(key, instance).data('key', key);
});
在您的代码中,您正在用自己的对象覆盖此对象。但是,滑块需要有一个 Unslider 实例。所以你想要做的是得到这个实例,然后用你自己的函数扩展它:
var key = $(this).data('key');
var obj = $(this).data(key);
obj.test = function() { console.log('Working!'); };
感谢您的回答!我是这样做的:
(function($){
var originalMethod = $.fn.unslider;
$.fn.extend({
unslider: function(o) {
var len = this.length;
var applyMethod = originalMethod.apply( this, arguments );
var key = applyMethod.data('key');
var instance = applyMethod.data(key);
// Cache a copy of $(this), so it
var me = $(this);
if (instance) {
instance.movenext = function (callback) {
return instance.stop().to(instance.i + 1, callback);
};
instance.moveprev = function (callback) {
return instance.stop().to(instance.i - 1, callback);
};
}
return applyMethod.data(key, instance);
}
});
})(jQuery)
关键是按照 sroes 的建议处理数据属性。
此外,我需要应用原始方法,因为我需要旧方法。