你在这里看到的是我从插件开始的方式:
(function($){
var methods = {
init: function(){
$this = this;
alert('init '+$this.attr('id'));
}
,
show_id: function(){
alert($this.attr('id'));
}
};
var $this;
// other vars
$.fn.my_plug = 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, Array.prototype.slice.call(args, 0));
} else {
$.error('Method '+method+' does not exist!');
}
});
};
})(jQuery);
var a = true;
if (a) $('#object').my_plug(); // alerts "init object"
$('#object').my_plug('show_id'); // alerts "object"
var b = false;
if (b) $('#object_b').my_plug(); // does nothing
$('#object_b').my_plug('show_id'); // calls "show_id"-method … but $this is not defined. It should NOT call because this object is not initialized !!!
在底部,您可以看到我如何调用插件方法。
第一个问题:有没有更简洁的方法来获取“this”/方法中的对象?我认为首先在插件外部定义 var,然后在插件内部,然后在 init-function 内部定义是很不酷的。有没有更清洁的方法来做到这一点?
正如您在底部看到的:我只想在 if 语句为真时调用插件。如果它是真的,那么它会调用 init。然后我调用插件的一个方法,它也可以正常工作,因为“$this”是之前定义/初始化的。但是如果 if-statment 不正确并且插件的“init”-method 没有被调用……我认为可以调用插件的方法是不合逻辑的。
所以这是问题 #2:如果对象之前没有初始化,我如何防止调用方法?如果我调用$('#object_b').my_plug('show_id');
它不应该做任何事情,因为我们没有初始化插件。它应该只在插件被初始化或者定义了“$this”的情况下才可用。
你怎么看?