jQuery插件选项:必需,可选,不可访问

时间:2010-04-27 02:52:35

标签: javascript jquery data-structures jquery-plugins

我很好奇如何以某些需要的方式为jQuery插件指定选项,有些可选地被覆盖,有些则无法触及。

我开始平常:

jQuery.fn.plugin = function (options){
  var defaults = { username: "", posts:10, api: "http://myapi.com" }
  var settings = jQuery.extend({}, defaults, options);
}

假设我需要usernameposts是可选的(默认为10),而您(您是该插件的用户)无法更改api,甚至如果他们尝试理想情况下,它们仍然处于相同的数据结构中,而不是分成单独的对象。想法?

2 个答案:

答案 0 :(得分:5)

$.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
}

以下是摘要:

  • 所需参数通常最清楚地作为普通有序参数传递。如果有太多这些考虑某种结构 - 或更好 - 一种不同的API。
  • 最容易通过选项哈希指定选项作为最后一个参数。一般来说,这些应该是可选的,但如果它们丢失,肯定会抛出错误。
  • 使用jQuery的extend函数填写默认值。你通常会有一些“默认值”来收集它们。我喜欢将这些内容作为名称间距的插件名称本身 - 并作为有用选项的有用文档。
  • 如果缺少必需参数,通常为throw
  • 如果你有值,你不希望调用者搞乱,在你的插件中定义它们,Javascript的范围将阻止调用者搞乱它们。

答案 1 :(得分:1)

如果你想要用户名,我会把它作为一个参数,因为它是唯一需要的东西,你不想用这种方式做20个参数。像这样:

jQuery.fn.plugin = function (username, options){
  var defaults = { posts:10, api: "http://myapi.com" }
  var settings = jQuery.extend({}, defaults, options);
}

在单个传递的对象中没有一个干净的必需的方法来完成完全,至少不是一个简单的,这是你想要的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;
  }
}

编辑 - 错过了部分问题,对于无法访问的问题,要么使用硬编码值,因为这是相同的结果,或者更清洁一点是插件中的内部对象在其他地方超出范围。同样,除非你一直说出一个intenalDefaults对象,并且在> 设置的扩展之后用调用jQuery.extend(),所以它会覆盖同一个对象并不容易。消费者传入。