常用的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 相关文章推荐
利用Ext Js生成动态树实例代码
Sep 08 Javascript
用jQuery模拟select下拉框的简单示例代码
Jan 26 Javascript
JavaScript中document.forms[0]与getElementByName区别
Jan 21 Javascript
JS正则表达式比较常见用法
Jan 26 Javascript
Bootstrap Table使用整理(二)
Jun 09 Javascript
webpack打包js的方法
Mar 12 Javascript
Vue波纹按钮组件制作
Apr 30 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
Aug 30 Javascript
详解一个基于套接字实现长连接的express
Mar 28 Javascript
微信小程序点击顶部导航栏切换样式代码实例
Nov 12 Javascript
Node.js API详解之 vm模块用法实例分析
May 27 Javascript
js实现菜单跳转效果
Dec 11 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 Ctemplate引擎开发相关内容
2012/03/03 PHP
PHP实现PDO的mysql数据库操作类
2014/12/12 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
对联广告js flash激活
2006/10/19 Javascript
任意位置显示html菜单
2007/02/01 Javascript
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
JQUERY 浏览器判断实现函数
2009/08/20 Javascript
JS实现将人民币金额转换为大写的示例代码
2014/02/13 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
在vue项目中使用sass的配置方法
2018/03/20 Javascript
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
基于javascript实现移动端轮播图效果
2020/12/21 Javascript
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
python基于paramiko将文件上传到服务器代码实现
2019/07/08 Python
Python Django框架模板渲染功能示例
2019/11/08 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
Python3+Selenium+Chrome实现自动填写WPS表单
2020/02/12 Python
毕业设计计划书
2014/01/09 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
Python绘制散乱的点构成的图的方法
2022/04/21 Python
如何Python使用re模块实现okenizer
2022/04/30 Python