我正在尝试创建一个能够在初始化后更新选项的插件。我从简单的插件开始,这将帮助我理解插件的逻辑。所以这就是:
;(function($) {
var defaults = {
message: 'This is default message'
};
var options = {};
var methods = {
init : function( options ) {
options = $.extend(defaults, options);
return this.each(function() {
$(this).click(function(){
alert(options.message);
});
});
},
option: function( key, value ){
if (val) {
options[key] = val;
} else {
return options[key];
}
}
};
$.fn.clickAlert = 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 {
//some error that method doesnt exist
}
};
})(jQuery);
正如您所看到的,此插件只显示带有已定义文本的警报消息。 另外,我有HTML页面(我包含jquery库和这个插件),有2个链接:
<a href="#" class="show">SHOW ALERT</a>
<a href="#" class="change">CHANGE ALERT MESSAGE</a>
我在“show”类的链接上创建了一个'clickAlert'插件实例。当我点击它时,它会显示我预期的默认消息。但我希望(例如)点击“更改”类的链接并更新先前创建的实例的“消息”属性。但有些错误。我在HTML页面上的jquery代码:
<script type="text/javascript">
jQuery(document).ready(function($) {
$('.show').clickAlert();
$('.change').click(function(){
$('.show').clickAlert('option', 'message', 'Updated message');
});
});
</script>
1)如何在这个jquery插件中正确实现选项/更新方法?
2)我还有一个问题,但它与主要问题无关。例如,我将使用此模式创建插件。除了init和option方法之外,插件还有10个方法(例如)负责动画。在我的init方法中,我需要检查(使用SWITCH语句)我应该调用哪个动画方法并调用它。因为我需要多次执行此操作,所以最好创建一个函数以避免代码发布。创建这样的功能的最佳位置在哪里?我应该将它创建为一个新方法(如init,option和其他动画方法),或者我可以在init的“return this.each()”函数中创建它并在那里调用几次?
答案 0 :(得分:3)
这是一个范围问题,您需要更改选项的范围 - 通常您不会,但在这种情况下您会这样做,所以您更改为修改$.extend(
中的原始选项,并给它因此参考:
;(function ($) {
var self = this;
self.defaults = {
message: 'This is default message'
};
self.options = {};
var methods = {
init: function (options) {
options = $.extend(self.options, self.defaults, options);
return this.each(function () {
$(this).click(function () {
alert(options.message);
});
});
},
option: function (key, myvalue) {
if (myvalue) {
self.options[key] = myvalue;
} else {
return self.options[key];
}
}
};
$.fn.clickAlert = 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 {
//some error that method doesnt exist
}
};
})(jQuery);
jQuery(document).ready(function ($) {
$('.show').clickAlert();
$('.change').click(function () {
$('.show').clickAlert('option', 'message', 'Updated message');
});
});