我一直在尝试理解如何构建一个良好的插件结构,以便它可以接受带选项的方法调用、纯方法调用、带选项的初始化以及不带选项的初始化。
到目前为止,这是我所拥有的内容。
到目前为止,这是我所拥有的内容。
(function($) {
var settings = {};
var defaults = {
args : "default args"
};
var methods = {
init : function(options) {
if(options) {
settings = $.extend({},defaults,options);
}
},
test : function(arg) {
alert("test: " + arg.args);
alert("args: " + settings.args);
}
};
$.fn.dataTable = function(method) {
var args = arguments;
var $this = this;
return this.each(function() {
if ( methods[method] ) {
return methods[method].apply( $this, Array.prototype.slice.call( args, 1 ));
} else if ( typeof method === 'object' || ! method ) {
return methods.init.apply( $this, args );
} else {
$.error( 'Method ' + method + ' does not exist on jQuery.plugin' );
}
});
};
})(jQuery);
$(document).ready(function(){
$(".tbl").dataTable();
//$(".tbl").dataTable({ args : "hello world" });
$(".tbl").dataTable("test",{args:"test args passed"});
//$(".tbl").dataTable("test");
});
然而,我收到以下内容:
测试:传递的测试参数
和
参数:未定义
需要帮助吗?
var $this = this
- rlemon.apply($this...)
,而是使用.apply($(this)...)
,至少可以使用.each()
函数中的单个元素。 - Scrimothyreturn methods[method].apply($(this), Array.prototype.slice.call(outerArguments, 1));
以便在每个循环中应用函数到一个特定的元素,否则例如当$this
是8个匹配div的数组时,将导致调用函数64次(8个循环x每个循环8个元素)。默认的init
部分也是如此。这意味着$this
赋值不是必需的,可以被删除。我将其命名为outerArguments
而不是args
,以使代码更清晰,但这对于$(this)
问题并不重要。 - Xavi Montero$(this)
而不是$this
,我正在初始化8个独立的实例,并且运行良好。 - Xavi Montero