dev*_*vth 5 javascript jquery jquery-plugins data-structures
我很好奇如何以某些需要的方式为jQuery插件指定选项,有些是可选的重写,有些是无法触及的.
我开始平常:
jQuery.fn.plugin = function (options){
var defaults = { username: "", posts:10, api: "http://myapi.com" }
var settings = jQuery.extend({}, defaults, options);
}
Run Code Online (Sandbox Code Playgroud)
假设我想要username是必需的,posts是可选的(默认为10),你(你是插件的用户)不能改变api,即使他们尝试.理想情况下,它们仍然处于相同的数据结构中,而不是分成单独的对象.想法?
$.fn.plugin = function(username, options) {
if (!username) throw "Must provide a username.";
var config = $.extend({}, $.fn.plugin.defaults, options);
var privateVal = 4;
...
}
$.fn.plugin.defaults = {
posts: 10
}
Run Code Online (Sandbox Code Playgroud)
这是一个总结:
extend函数填写默认值.你通常会有一些"默认值"来收集它们.我喜欢将这些内容作为名称间距的插件名称本身 - 并作为有用选项的有用文档.throw如果缺少必需参数.如果您希望用户名是必需的,我会将其设置为一个参数,因为它是唯一必需的内容,并且您想要这样做的参数没有 20 个。像这样的东西:
jQuery.fn.plugin = function (username, options){
var defaults = { posts:10, api: "http://myapi.com" }
var settings = jQuery.extend({}, defaults, options);
}
Run Code Online (Sandbox Code Playgroud)
没有一种干净的必需方法可以在单个传递的对象中完全完成此操作,至少不是简单的方法,而这正是您想要的 API。另一种选择是不指定默认值和警报或其他内容(如果我认为不存在的话):
jQuery.fn.plugin = function (options){
var defaults = { posts:10, api: "http://myapi.com" }
var settings = jQuery.extend({}, defaults, options);
if(typeof options.username == 'undefined') {
alert("You must specify a username");
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑- 错过了问题的一部分,对于无法访问的问题,要么对值进行硬编码,因为这是相同的结果,要么更干净一点是插件内的内部对象,该对象超出了其他地方的范围。同样,对同一个对象执行的操作并不是微不足道的,除非您一直说一个intenalDefaults对象,并在扩展设置后jQuery.extend()调用它,这样它就会覆盖消费者传入的任何内容。