jQuery插件开发方式主要有三种:
- 通过$.extend()来扩展jQuery
- 通过$.fn 向jQuery添加新的方法
- 通过$.widget()应用jQuery UI的部件工厂方式创建
第一种方式太简单,仅仅是在jQuery命名空间或者理解成jQuery身上添加了一个静态方法而已,所以我们调用通过$.extend()添加的函数时直接通过$符号调用($.myfunction())而不需要选中DOM元素($('#example').myfunction()),这种方式无法利用jQuery强大的选择器带来的便利,要处理DOM元素以及将插件更好地运用于所选择的元素身上,还是需要使用第二种开发方式
通常我们使用第二种方法来进行简单插件开发,说简单是相对于第三种方式。第三种方式是用来开发更高级jQuery部件的,该模式开发出来的部件带有很多jQuery内建的特性,比如插件的状态信息自动保存,各种关于插件的常用方法等 - 请按照以下的方式(安全结构良好的代码)编写插件
(function($,window,document,undefined){
//我们的代码。。
//blah blah blah...
})(jQuery,window,document);
//简易的一个例子
(function($, window, document,undefined) {
//定义Beautifier的构造函数
var Beautifier = function(ele, opt) {
this.$element = ele,
this.defaults = {
'color': 'red',
'fontSize': '12px',
'textDecoration': 'none'
},
this.options = $.extend({}, this.defaults, opt)
}
//定义Beautifier的方法
Beautifier.prototype = {
beautify: function() {
return this.$element.css({
'color': this.options.color,
'fontSize': this.options.fontSize,
'textDecoration': this.options.textDecoration
});
}
}
//在插件中使用Beautifier对象
$.fn.myPlugin = function(options) {
//创建Beautifier的实体
var beautifier = new Beautifier(this, options);
//调用其方法
return beautifier.beautify();
}
})(jQuery, window, document);
编写中的注意事项:
- 在代码开头加一个分号
用来充当自调用匿名函数的第一对括号容易与别人定义的函数相连,中间没有分号造成我们的代码无法正常解析进而报错,所以好的做法是我们在代码开头加一个分号,这在任何时候都是一个好的习惯 - 将系统变量以参数形式传递到插件内部可以提高访问速度
至于这个undefined,稍微有意思一点,为了得到没有被修改的undefined,我们并没有传递这个参数,但却在接收时接收了它,因为实际并没有传,所以‘undefined’那个位置接收到的就是真实的'undefined'了 - 命名规范
- a:变量及函数命名 一般使用驼峰命名法(CamelCase)
- b:在JavaScript中多用单引号
- 插件开发请使用面向对象思维
因为如果不这样,你可能需要一个方法的时候就去定义一个function,当需要另外一个方法的时候,再去随便定义一个function,同样,需要一个变量的时候,毫无规则地定义一些散落在代码各处的变量
保护好默认参数
var defaults = { 'color': 'red', 'fontSize': '12px'
};
var settings = $.extend(defaults, options);
var defaults = {
'color': 'red', 'fontSize': '12px'
};
var settings = $.extend({},defaults, options);//将一个空对象做为第一个参数
- 示例代码a中调用extend时会将defaults的值改变,这样不好,因为它作为插件因有的一些东西应该维持原样,另外就是如果你在后续代码中还要使用这些默认值的话,当你再次访问它时它已经被用户传进来的参数更改了
示例代码b中将一个新的空对象做为$.extend的第一个参数,defaults和用户传递的参数对象紧随其后,这样做的好处是所有值被合并到这个空对象上,保护了插件里面的默认值
- 示例代码b
- 示例代码a
- 让插件接收参数
一个强劲的插件是可以让使用者随意定制的,这要求我们提供在编写插件时就要考虑得全面些,尽量提供合适的参数 - 支持链式调用
要让插件不打破jQuery支持链式调用的特性(选择好DOM元素后可以不断地调用其他方法),只需return一下即可
基于jQuery开发的快速操作cookie插件,下面的仅仅做参考。
/**
* Created by Wolf Mr.Yu on 2017/11/26/ 18:30.
*
* 请先引入jQuery库,否则插件无法运行
*
* 该文件用于快速操作cookie
*
* 调用说明 $.method()
* 例:$.setCookie('userId','74110',30);
*
* */
try{
(function($,window){
$.extend({
/**
* 写入cookie
* @param cookieName{String} cookie名
* @param value {String} 值
* @param time {Number} 有效时间(天)
* @return Boolean
* PS: true 成功 false 失败
* */
setCookie:function(cookieName,value,time){
if(cookieName != undefined && value != undefined){
var days = time == undefined ? 30 : time;
var expires = new Date();
expires.setTime(expires.getTime() + days*24*60*60*1000);
document.cookie = cookieName + "="+ escape (value) + ";expires=" + expires.toGMTString();
return true;
}
return false;
},
/**
* 获取cookie
* @param cookieName{String} cookie名
* @return String
* */
getCookie:function(cookieName){
var arr = new Array();
var reg = new RegExp("(^| )" + cookieName + "=([^;]*)(;|$)");
if( arr = document.cookie.match(reg)){
return unescape(arr[2]);
}
return null;
},
/**
* 清除指定cookie
* @param cookieName{String} cookie名
* @return Boolean
* PS: true 成功 false 失败
* */
clearCookie:function(cookieName){
var expires = new Date();
expires.setTime(expires.getTime() - 1);
if(cookieName != null){
document.cookie = cookieName + "='';expires=" + expires.toGMTString();
return true;
}
return false;
},
/**
* 清除所有cookie
* @return Boolean
* PS: true 成功 false 失败
* */
clearAllCookie:function(){
try{
var allCookie = document.cookie;
var arrCookie = allCookie.split("; ");
for(var i = 0; i < arrCookie.length; i++){
var arr = arrCookie[i].split("=");
if(arr[0]){
this.clearCookie(arr[0]);
}
}
return true;
}catch(e){
alert(e);
return false;
}
}
});
})(jQuery,this)
}catch(e){
alert(e+'\n请引入jQuery');
}