常用的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 相关文章推荐
表单提交验证类
Jul 14 Javascript
解析window.open的使用方法总结
Jun 19 Javascript
flash调用js中的方法,让js传递变量给flash的办法及思路
Aug 07 Javascript
js键盘事件的keyCode
Jul 29 Javascript
js实现的牛顿摆效果
Mar 31 Javascript
详解AngularJS中的表达式使用
Jun 16 Javascript
CSS或者JS实现鼠标悬停显示另一元素
Jan 22 Javascript
JS弹出新窗口被拦截的解决方法
Aug 09 Javascript
深入掌握 react的 setState的工作机制
Sep 27 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
Apr 15 Javascript
VUE路由动态加载实例代码讲解
Aug 26 Javascript
在Vue.js中使用TypeScript的方法
Mar 19 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
php中配置文件操作 如config.php文件的读取修改等操作
2012/07/07 PHP
PHP获取数组最后一个值的2种方法
2015/01/21 PHP
JQuery中关于jquery.js与jquery.min.js的比较探讨
2013/05/15 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
老生常谈JavaScript中的this关键字
2016/10/01 Javascript
JavaScript触发onScroll事件的函数节流详解
2016/12/14 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
JS实现复制功能
2017/03/01 Javascript
整理关于Bootstrap排版的慕课笔记
2017/03/29 Javascript
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
vue中组件通信的八种方式(值得收藏!)
2019/08/09 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
2020/12/24 Javascript
JS几个常用的函数和对象定义与用法示例
2020/01/15 Javascript
[02:28]DOTA2英雄基础教程 狼人
2013/12/23 DOTA
Python httplib,smtplib使用方法
2008/09/06 Python
Python字符串格式化输出方法分析
2016/04/13 Python
深入理解python函数递归和生成器
2016/06/06 Python
Python3一行代码实现图片文字识别的示例
2018/01/15 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
pyqt5移动鼠标显示坐标的方法
2019/06/21 Python
Python读取YAML文件过程详解
2019/12/30 Python
python实现堆排序的实例讲解
2020/02/21 Python
Django数据库操作之save与update的使用
2020/04/01 Python
北大研究生linux应用求职信
2013/10/29 职场文书
年度考核自我评价
2014/01/25 职场文书
财务支持类个人的自我评价
2014/02/14 职场文书
《美丽的彩虹》教学反思
2014/02/25 职场文书
高三毕业寄语
2014/04/10 职场文书
领导班子四风问题对照检查材料
2014/09/27 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
财务检查整改报告
2014/11/06 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
MySQL详解进行JDBC编程与增删改查方法
2022/06/16 MySQL