JavaScript插件化开发教程 (一)


Posted in Javascript onJanuary 27, 2015

一,开篇分析

Hi,大家!今天这系列文章主要是说说如何开发基于“JavaScript”的插件式开发,我想很多人对”插件“这个词并不陌生,

有的人可能叫“组件”或“部件”,这不重要,关键是看如何设计,如何做一个全方位的考量,这是本文的重点阐述的概念。我想大家对

“jQuery插件的方式”有一定的了解,我们结合这个话题一起讨论一下,最终给出相关的实现方案,来不断提高自己的谁能力。

JavaScript插件化开发教程 (一)

二,进入插件正题

一般来说,jQuery插件的开发分为两种:一种是挂在jQuery命名空间下的全局函数,也可称为静态方法。

另一种是jQuery对象级别的方法,即挂在jQuery原型下的方法,这样通过选择器获取的jQuery对象实例也能共享该方法。

(1),类级别的插件开发

类级别的插件开发最直接的理解就是给"jQuery"类添加类方法,可以理解为添加静态方法。典型的例子就是"$.ajax()"这个函数,将函数定义于jQuery的命名空间中。关于类级别的插件开发可以采用如下几种形式进行扩展:

1.1添加一个全局函数,我们只需如下定义,看代码: 

$.hello = function(){

    alert("Hello,大熊君!") ;

} ;

1.2添加多个全局函数,可采用如下定义:

$.extend({

    hello : function(name){

        // put your code here

    } ,

    world : function(){

        // put your code here

    }

}) ;

说明:”$.extend(target, [object1], [objectN])“(该方法主要用于合并两个或更多对象的内容(属性)到第一个对象,并返回合并后的第一对象。

如果该方法只有一个参数target,则该参数将扩展jQuery的命名空间,即作为静态方法挂在jQuery全局对象下)。

(2),对象级别的插件开发

 对象级别的插件开发需要如下的两种形式:

 2.1通过“$.fn.extend()”为原型动态挂载相关的属性。

(function($){   

    $.fn.extend({   

        pluginName : function(opts){   

            // put your code here

        }   

    }) ;   

})(jQuery) ;  

 2.2直接添加动态属性到原型链上。

 (function($) {     

     $.fn.pluginName = function(){   

         // put your code here  

     } ;   

 })(jQuery) ; 

说明一下:二者是等价的,对于一个jQuery插件,一个基本的函数就可以很好地工作,但是对于复杂一点的插件就需要提供各种各样的方法和私有函数。

你可能会使用不同的命名空间去为你的插件提供各种方法,但是添加过多的命名空间反而会使代码变得混乱,健壮性下降。所以最好的解决办法是适当地定义私有函数和方法。

所以我们通过自执行函数与闭包的结合实现模拟的私有插件单元,就像我们上面的实例中一样。

(三),下面给一个简单的例子看看实现的过程:

(1),“html”片段代码,如下:

<div id="bb" style="width:220px;border:1px solid #ccc;">

   <span></span>

   <div 

       style="margin-top:10px;

       margin-bottom:30px;"

   >8     </div>

</div>           

(2),“data.json”定义如下:

{


"text" : "你好,大熊君{{bb}} !" ;

}

(3),"bb.js"代码如下:

$(function(){

    $("#bb").bigbear() ;

}) ;

(function($){

    $.fn.bigbear = function(opts){

        opts = $.extend({},$.fn.bigbear.defaults,opts) ;

        return this.each(function(){

            var elem = $(this) ;

            elem.find("span").text(opts["title"]) ;

            $.get(opts["url"],function(data){

                elem.find("div").text(data["text"]) ;

            }) ;

        }) ;

    } ;

    $.fn.bigbear.defaults = {

        title : "这是一个简单的测试" ,

        url : "data.json"

    } ;

})(jQuery) ;

运行效果:

JavaScript插件化开发教程 (一)

小结一下

(1)“$.fn.bigbear.defaults”提供插件的默认参数选项一个扩展性良好的插件应该是可以让使用者根据需求自定义参数选项,并控制插件的行为,所以提供恢复默认选项是很有必要的。你可以通过jQuery的extend方法来设置这些选项。

(2),“return this.each(){...}”遍历多个元素并返回jQuery使用Sizzle选择器引擎,Sizzle可以为你的函数提供多元素操作(例如对所有类名相同的元素)。这是jQuery几个优秀的特性之一,在开发插件过程中即使你不准备为你的插件提供多元素支持,但为这做准备仍然是一个很好的方式。另外,jQuery有一个很好的特点就是可以进行方法级联,也可称为链式调用,所以我们不应该破坏这个特性,始终在方法中返回一个元素。

(四),最后总结

(1),jQuery为开发插件提拱了两个方法,分别是:jQuery.fn.extend(object);  给jQuery对象添加方法。
jQuery.extend(object);  为扩展jQuery类本身.为类添加新的方法。

(2),把全部代码放在闭包(一个即时执行函数)里此时闭包相当于一个私有作用域,外部无法访问到内部的信息,并且不会存在全局变量的污染情况。官方创建开发规范的解释是:a) 避免全局依赖;b) 避免第三方破坏;c) 兼容jQuery操作符'$'和'jQuery '。

(3),提供插件的默认参数选项一个扩展性良好的插件应该是可以让使用者根据需求自定义参数选项,并控制插件的行为,所以提供恢复默认选项是很有必要的。你可以通过jQuery的extend方法来设置这些选项

(4),遍历多个元素并返回jQuery使用Sizzle选择器引擎,Sizzle可以为你的函数提供多元素操作(例如对所有类名相同的元素)。这是jQuery几个优秀的特性之一,在开发插件过程中即使你不准备为你的插件提供多元素支持,但为这做准备仍然是一个很好的实践。另外,jQuery有一个很好的特点就是可以进行方法级联,也可称为链式调用,所以我们不应该破坏这个特性,始终在方法中返回一个元素。

(5),一次性代码放在主循环以外这一条很重要,但是常常被忽略。简单的讲,如果你有一段代码是一堆默认值,只需要被实例化一次,而不是每次调用你插件功能的时候都需要实例化,你应该把这段代码放在插件方法的外面。

(6),大家学习完思考一下,如果项目技术选型换了这些插件又是强依赖“jQuery”机制,我们以前写的插件将会不能用(假设不用jQuery的情况),如何做重构那?

明天的文章就会说一下这个问题,并且将会重构插件的关键逻辑,敬请期待。。。

Javascript 相关文章推荐
Jquery获取复选框被选中值的简单方法
Jul 04 Javascript
js中关于一个分号的崩溃示例
Nov 11 Javascript
JavaScript实现url地址自动检测并添加URL链接示例代码
Nov 12 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
Jan 13 Javascript
js判断变量初始化的三种形式及推荐用的形式
Jul 22 Javascript
理解javascript中的回调函数(callback)
Sep 02 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
Sep 20 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
May 12 Javascript
Angular2学习教程之组件中的DOM操作详解
May 28 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
Dec 04 Javascript
vue 使用rules对表单字段进行校验的步骤
Dec 25 Vue.js
javascript的setTimeout()使用方法总结
Nov 20 Javascript
js的toLowerCase方法用法实例
Jan 27 #Javascript
js的toUpperCase方法用法实例
Jan 27 #Javascript
JS输入用户名自动显示邮箱后缀列表的方法
Jan 27 #Javascript
js判断鼠标左、中、右键哪个被点击的方法
Jan 27 #Javascript
js判断是否按下了Shift键的方法
Jan 27 #Javascript
js获取json元素数量的方法
Jan 27 #Javascript
javascript修改图片src的方法
Jan 27 #Javascript
You might like
PHP 柱状图实现代码
2009/12/04 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
thinkPHP5框架接口写法简单示例
2019/08/05 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
轻量级 JS ToolTip提示效果
2010/07/20 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
Ajax搜索结果页面下方的分页按钮的生成
2012/04/05 Javascript
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
20个实用的JavaScript技巧分享
2014/11/28 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
2017/12/09 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
在vue中使用jsx语法的使用方法
2019/09/30 Javascript
vue弹出框组件封装实例代码
2019/10/31 Javascript
js中forEach,for in,for of循环的用法示例小结
2020/03/14 Javascript
JS实现随机点名器
2020/04/12 Javascript
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
python2.7的编码问题与解决方法
2016/10/04 Python
Python 实现一个颜色色值转换的小工具
2016/12/06 Python
python使用super()出现错误解决办法
2017/08/14 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
python 基于dlib库的人脸检测的实现
2019/11/08 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
淘宝活动策划方案
2014/02/06 职场文书
酒店值班经理的工作职责范本
2014/02/18 职场文书
初中生操行评语大全
2014/04/24 职场文书
物业工程部经理岗位职责
2015/04/09 职场文书
CSS 鼠标选中文字后改变背景色的实现代码
2023/05/21 HTML / CSS