常用的jquery模板插件——jQuery Boilerplate介绍


Posted in Javascript onSeptember 23, 2014

在初次进行jquery插件开发时,我们往往无从下手,当然我们可以按照jquery官方提供的格式进行简单的插件开发,但是很多时候往往不尽完美,一不小心,就造出一个很“烂”的插件:难以维护、难以扩展、使用繁琐、性能不佳...当我们在不断的实践中,慢慢积累下来时,有些问题得到了有效的避免,但也带来了新的问题:在众多纷杂的jquery插件开发模式中,究竟哪一种模式才是最好的呢?

如果能提供一个模板,通过一定的约束和规范为开发者解决在jquery插件开发中的“迷惘”那该多好!在这里主要介绍下一个在实际开发中最常用的jquery模板插件——jQuery Boilerplate

jQuery Boilerplate不是jquery插件开发的银弹,他并没有提供各种模式的完美解决方案,当然这也不是他所追求的目标,他的目的只是提供一个最基础的模板,对于初学者而言,你只需要在这个模板的基础上做相应的修改即可。来看一下jQuery Boilerplate提供的一个基础模板(是不是觉得很熟悉呢?没错,bootstrap就是这个模式):

// 这个分号的作用是防止和其他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 );

上面的模板是一个轻量级的基础模板,在开发中已经能满足我们大部分需求,例如:对象只实例化一次,链式调用、默认参数、以及公有和私有方法的调用。来看一个示例:

http://jsfiddle.net/mirandaasm/wjPvF/3/

但是在实际开发中,尤其在有一定规模的组件开发中,我们还面临着很多问题需要解决,比如命名空间的冲突、插件的可扩展性以及公有方法如何方便的调用?当然还有一部分是个人爱好的原因,我就喜欢使用其他模式的开发方式。这里jQuery Boilerplate也提供了几种不同模式的组件开发方式,你可以选择一个适合你的使用:

轻量级(基础)模式 为初学者提供的一个简单通用的基础模板,包括基础的默认对象、简单的构造函数、默认参数和传递参数的合并以及防止对象多次实例化的构造函数的简单封装。

Widget factory 工厂模式,没错,jquery ui使用的典型模式,使用面向对象的方式构建复杂有状态的组件,jquery ui中的组件大部分依赖于widget factory基础组件,这个基础模板提供了大部分的默认方法,包括事件触发方法。
Widget factory + RequireJS 这是个使用RequireJS对Widget factory进行简单封装,使其支持AMD模块化加载规范。
Namespaced pattern 命名空间模式,在和其他插件一起使用时,采用命名空间模式避免和其他插件的冲突问题。

Javascript 相关文章推荐
读jQuery之九 一些瑕疵说明
Jun 21 Javascript
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
Jul 31 Javascript
原生javascript实现图片滚动、延时加载功能
Jan 12 Javascript
javascript实现图片自动和可控的轮播切换特效
Apr 13 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
Jun 29 Javascript
javascript实现的闭包简单实例
Jul 17 Javascript
jQuery获取同级元素的简单代码
Jul 09 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
Apr 11 Javascript
详解vue2 $watch要注意的问题
Sep 08 Javascript
vue两个组件间值的传递或修改方式
Jul 04 Javascript
微信小程序页面调用自定义组件内的事件详解
Sep 12 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
Sep 23 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
Sep 23 #Javascript
IE6 hack for js 集锦
Sep 23 #Javascript
深入理解javascript作用域和闭包
Sep 23 #Javascript
js变量、作用域及内存详解
Sep 23 #Javascript
js单独获取一个checkbox看其是否被选中
Sep 22 #Javascript
多个checkbox被选中时如何判断是否有自己想要的
Sep 22 #Javascript
js css 实现遮罩层覆盖其他页面元素附图
Sep 22 #Javascript
You might like
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
php中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
调试PHP程序的多种方法介绍
2014/11/06 PHP
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
PHP多文件上传类实例
2015/03/07 PHP
PHP开发中csrf攻击的简单演示和防范
2017/05/07 PHP
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
javascript小数四舍五入多种方法实现
2012/12/23 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
Jquery中offset()和position()的区别分析
2015/02/05 Javascript
arguments对象验证函数的参数是否合法
2015/06/26 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
ECMAScript6快速入手攻略
2016/07/18 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
2017/05/09 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
VueJs单页应用实现微信网页授权及微信分享功能示例
2017/07/26 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
[04:47]DOTA2-潍坊风行电子俱乐部探秘
2014/08/08 DOTA
Python 深入理解yield
2008/09/06 Python
python+selenium开发环境搭建图文教程
2017/08/11 Python
Python实现打砖块小游戏代码实例
2019/05/18 Python
基于pytorch的保存和加载模型参数的方法
2019/08/17 Python
Django xadmin开启搜索功能的实现
2019/11/15 Python
Python 音频生成器的实现示例
2019/12/24 Python
如何定义TensorFlow输入节点
2020/01/23 Python
HTML5 标准将把互联网视频扔回到黑暗时代
2010/02/10 HTML / CSS
父亲生日宴会答谢词
2014/01/10 职场文书
保护环境的建议书
2014/03/12 职场文书
爱祖国演讲稿
2014/05/04 职场文书
个人四风问题对照检查材料
2014/09/26 职场文书
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS