我搜索了很多,但我仍然不确定,这是做我想做的最好的方法。我正在编写一个 jQuery 插件,它已经工作了,但现在我想改进我的代码,因为我在编写这个插件时了解了更多的功能。
作为基础,我从官方 jQuery 页面http://docs.jquery.com/Plugins/Authoring 获取代码(插件选项)
我不会在这里使用我自己的代码,因为来自 jQuery 的代码已经足够我的问题了
(function( $ ){
var methods = {
init : function( options ) {
var defaults = {
value1: '',
value2: ''
};
var options = $.extend(defaults, options);
return this.each(function(){
value3 = $(this).parent();
});
},
log : function( ) {
console.log(value3);
console.log(defaults.value1);
}
};
$.fn.my_plugin = function( method ) {
// Method calling logic
if ( methods[method] ) {
return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
} else if ( typeof method === 'object' || ! method ) {
return methods.init.apply( this, arguments );
} else {
$.error( 'Method ' + method + ' does not exist on jQuery.tooltip' );
}
};
})( jQuery );
这就是我的插件的结构。它现在非常剥离;)现在我想做这样的事情:
$('#element1').my_plugin({value1 : 1, value2 : 2});
$('#element2').my_plugin({value1 : 3, value2 : 4});
现在我想在控制台中记录值(不完全是我真正想要做的,但对于我的问题,这又足够了)
此外,我想使用这样的功能
$('#element1').my_plugin('log');
$('#element2').my_plugin('log');
这是我的第一个问题。当我在日志函数中时,如何从初始化函数中获取变量?最好的方法是什么?
我试图像这样设置全局值:
(function( $ ){
var defaults = {
value1: '',
value2: ''
};
var methods = {
init : function( options ) {
return this.each(function(){
value3 = $(this).parent();
});
},
log : function( ) {
console.log(value3);
console.log(defaults.value1);
}
};
但是如果我这样做并使用$('#element1').my_plugin('log');
,我只能从第二个初始化中获得默认值$('#element2').my_plugin({value1 : 3, value2 : 4});
所以这是我的第二个问题:如何为每个初始化使用特定变量?
我希望很清楚,我想知道什么。我仍在学习 jQuery 并尽我所能,并搜索了很多如何解决我的这个结构的问题。我想使用这种结构,因为它是 jquery 的官方结构,我喜欢做正确的事情:P
也想很快在这里看到一些答案:)
谢谢你的帮助,
朱利安
如果有人对基本插件结构感兴趣 - 这是我现在用于插件的内容:)
(function( $ ){
var methods = {
init : function( options ) {
console.log('init');
var defaults = {
value1: '',
value2: ''
};
var options = $.extend(defaults, options);
return this.each(function(){
var $this = $(this);
var data = $this.data('test');
var parent = $this.parent();
var element = $this;
if (!data) {
var data = {};
$.each(options, function(key, value) {
data[key] = value;
});
data["parent"] = parent;
data["element"] = element;
$this.data('test', data);
}
$this.test('log');
});
},
log : function() {
console.log('log');
return this.each(function(){
var $this = $(this);
var data = $this.data('test');
console.log(data);
});
}
};
$.fn.test = function( method ) {
if ( methods[method] ) {
return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
} else if ( typeof method === 'object' || ! method ) {
return methods.init.apply( this, arguments );
} else {
$.error( 'Method ' + method + ' does not exist on jQuery.test' );
}
};
})( jQuery );