在初次进行jquery插件开发时,咱们每每无从下手,固然咱们能够按照jquery官方提供的格式进行简单的插件开发,可是不少时候每每不尽完美,一不当心,就造出一个很“烂”的插件:难以维护、难以扩展、使用繁琐、性能不佳...当咱们在不断的实践中,慢慢积累下来时,有些问题获得了有效的避免,但也带来了新的问题:在众多纷杂的jquery插件开发模式中,究竟哪种模式才是最好的呢?javascript
若是能提供一个模板,经过必定的约束和规范为开发者解决在jquery插件开发中的“迷惘”那该多好!在这里主要介绍下一个在实际开发中最经常使用的jquery模板插件——jQuery Boilerplatejava
jQuery Boilerplate不是jquery插件开发的银弹,他并无提供各类模式的完美解决方案,固然这也不是他所追求的目标,他的目的只是提供一个最基础的模板,对于初学者而言,你只须要在这个模板的基础上作相应的修改便可。来看一下jQuery Boilerplate提供的一个基础模板(是否是以为很熟悉呢?没错,bootstrap
就是这个模式):jquery
// 这个分号的做用是防止和其余jquery插件合并时,别人不规范的jquery插件忘记使用分号结束 //影响到咱们当前的插件,致使没法运行的问题。 ;(function ( $, window, document, undefined ) { // undefined做为形参的目的是由于在es3中undefined是能够被修改的 //好比咱们能够声明var undefined = 123,这样就影响到了undefined值的判断,幸运的是在es5中,undefined不能被修改了。 // window和document自己是全局变量,在这个地方做为形参的目的是由于js执行是从里到外查找变量的(做用域),把它们做为局部变量传进来,就避免了去外层查找,提升了效率。 // 声明默认属性对象 var pluginName = "defaultPluginName", defaults = { propertyName: "value" }; // 构造函数 function Plugin ( element, options ) { this.element = element; // 将默认属性对象和传递的参数对象合并到第一个空对象中 this.settings = $.extend( {}, defaults, options ); this._defaults = defaults; this._name = pluginName; this.init(); } // 为了不和原型对象Plugin.prototype的冲突,这地方采用继承原型对象的方法 $.extend(Plugin.prototype, { init: function () { // 初始化,因为继承自Plugin原型, // 你能够在这里直接使用this.element或者this.settings console.log("xD"); }, yourOtherFunction: function () { // some logic } }); // 对构造函数的一个轻量级封装, // 防止产生多个实例 $.fn[ pluginName ] = function ( options ) { this.each(function() { if ( !$.data( this, "plugin_" + pluginName ) ) { $.data( this, "plugin_" + pluginName, new Plugin( this, options ) ); } }); // 方便链式调用 return this; }; })( jQuery, window, document );
上面的模板是一个轻量级的基础模板,在开发中已经能知足咱们大部分需求,例如:对象只实例化一次,链式调用、默认参数、以及公有和私有方法的调用。来看一个示例:git
http://jsfiddle.net/mirandaasm/wjPvF/3/github
可是在实际开发中,尤为在有必定规模的组件开发中,咱们还面临着不少问题须要解决,好比命名空间的冲突、插件的可扩展性以及公有方法如何方便的调用?固然还有一部分是我的爱好的缘由,我就喜欢使用其余模式的开发方式。这里jQuery Boilerplate也提供了几种不一样模式的组件开发方式,你能够选择一个适合你的使用:bootstrap