标签:
编写插件的目的:给已经有的一系列方法或函数做一个封装,以便在其他地方重复使用,方便后期维护和提高开发效率。
jQuery插件主要分为3种类型:
1.封装对象方法的插件(对象级别组件开发)
这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作,是最常见的一种插件。这类插件可以发挥出jQuery选择器的强大优势。
即挂在jQuery原型下的方法,这样通过选择器获取的jQuery对象实例也能共享该方法,也称为动态方法(实例方法)
$.fn.myPlugin = function(){
//do something
}
//这里$.fn===$.prototype
//例如:addClass()、attr()等,需要创建实例来调用
2.封装全局函数的插件(类级别组件开发)
可以将独立的函数加到jQuery命名空间之下,例如jQuery.noConflict()方法就是jQuery内部作为全局函数的插件附加到内核上去的。
即给jQuery命名空间下添加新的全局函数,也称为静态方法
jQuery.myPlugin = function(){
//do something
}
//例如:$.Ajax()、$.extend()
3.选择器插件
个别情况下,会需要用到选择器插件。
//注意为了更好的兼容性,开始前有个分号
;(function($){//此处将$作为匿名函数的形参
//这里放置代码,可以使用$作为jQuery的缩写别名
//定义一个局部变量foo,仅函数内部可以访问,外部无法访问
var foo;
var bar = function(){
//在匿名函数内部的函数都可以访问foo,即便是在匿名函数的外部调用bar()的时候,也可以在bar()的内部访问到foo.但在匿名函数的外部直接访问foo是做不到的
}
$.BAR = bar;
//这个语句让匿名函数内部的函数bar()逃逸到全局可访问的范围内,这样就可以在匿名函数的外部调用,jQuery.BAR()来访问内部定义的函数bar(),并且内部函数bar()也能访问匿名函数内的变量foo
})(jQuery);//这里将jQuery作为实参传递给匿名函数
关于闭包,ECMAScript对其进行了这样的定义:允许使用内部函数(即函数定义和函数表达式位于另一个函数的函数体内),而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数,当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。即内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它让然必须访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明的值是外部函数返回时的值,但也会受到内部函数的影响。
我们利用闭包可以访问和修改包含函数中的局部变量
利用闭包的特性,既可以避免内部临时变量影响全局空间,又可以在插件内部继续使用$作为jQuery的别名.
插件应该会有一些选项是可以让开发者自己根据需要设置的,所以提供恢复默认选项是以有必要的。你可以通过jQuery的extend功能来设置这些选项:
var defaults = {//默认配置参数
‘container‘ : ‘#container‘,//容器
‘sections‘ : ‘.section‘,//子容器
‘easing‘ : ‘ease‘,//特效方式,ease-in,ease-out,linear
‘duration‘ : 1000,//每次动画执行的时间
‘pagination‘ : true,//是否显示分页
‘loop‘ : false,//是否循环
‘keyboard‘ : true,//是否支持键盘
‘direction‘ : ‘vertical‘,//滑动的方向horizontal,vertical,
};
opts = $.extend({}, defaults , options||{});
jQuery提供了两个用于扩展jQuery功能的方法:jQuery.extend()和jQuery.fn.extend().这两个方法都接受一个参数,类型为Object。Object对象的”名/值对”分别代表”函数或方法名/函数主体”.
jQuery.extend()方法除了可以用于扩展jQuery对象外,还可以用于扩展已有的object对象。
将对象的属性添加给jQuery对象
Demo:
<script type="text/javascript" src="jquery-2.1.4.js"></script>
<script type="text/javascript">
$(function(){
var obj1 = {
apple:0,
banana:{weight:52,price:100},
cherry:97
};
jQuery.extend(obj1);//这样写是将obj1对象的属性添加给jQuery对象
console.log(jQuery.apple);//0
console.log(jQuery.banana);//Object {weight: 52, price: 100}
console.log(jQuery.cherry);//97
});
</script>
用一个或多个其他对象来扩展一个对象,然后返回被扩展的对象。
Demo:
<script type="text/javascript" src="jquery-2.1.4.js"></script>
<script type="text/javascript">
/*
这个例子是合并obj1对象和obj2对象,修改并返回obj1对象
*/
$(function(){
var obj1 = {
name:"lisi",
job:"worker",
age:22
};
var obj2 = {
name:"wangwu",
age:100,
address:"大连"
};
$.extend(obj1,obj2);//默认第一个参数为false,即进行浅拷贝
console.log(obj1);//Object {name: "wangwu", job: "worker", age: 100, address: "大连"}
});
</script>
浅拷贝:
<script type="text/javascript" src="jquery-2.1.4.js"></script>
<script type="text/javascript">
$(function(){
var obj1 = {
apple:0,
banana:{weight:52,price:100},
cherry:97
};
var obj2 = {
banana:{price:200},
durian:100
};
var obj = $.extend(obj1,obj2);
var obj1 = $.extend(false,obj1,obj2);//默认第一个参数是false,浅拷贝
console.log(JSON.stringify(obj));//{"apple":0,"banana":{"price":200},"cherry":97,"durian":100}
console.log(JSON.stringify(obj1));
//从输出的结果可以看出,banana这个key值被替换掉了
});
</script>
深拷贝:也会对嵌套子对象进行递归合并
<script type="text/javascript" src="jquery-2.1.4.js"></script>
<script type="text/javascript">
$(function(){
var obj1 = {
apple:0,
banana:{weight:52,price:100},
cherry:97
};
var obj2 = {
banana:{price:200},
durian:100
};
var obj = $.extend(true,obj1,obj2);//第一个参数true表示深拷贝
console.log(JSON.stringify(obj));//{"apple":0,"banana":{"weight":52,"price":200},"cherry":97,"durian":100}
//深拷贝是进行递归合并,对已有属性值进行覆盖,没有的属性进行增加
</script>
深拷贝和浅拷贝结果对比:
//深拷贝
{"apple":0,"banana":{"weight":52,"price":200},"cherry":97,"durian":100}
//浅拷贝
//{"apple":0,"banana":{"price":200},"cherry":97,"durian":100}
浅拷贝的结果直接将banana的值进行了替换,深拷贝对banana的值进行合并修改,不是简单的直接替换。
jQuery.extend()方法经常被用于设置插件方法的一系列默认参数
Demo:
<script type="text/javascript" src="jquery-2.1.4.js"></script>
<script type="text/javascript">
$(function(){
function fn(options){
options = $.extend({
name:"bar",
length:5,
dataType:"xml"/*默认参数设置*/
},options);
return options;
}
console.log(fn({name:"a",length:6,dataType:"json"}));//Object {name: "a", length: 6, dataType: "json"}
console.log(fn({name:"b",length:7}));//Object {name: "b", length: 7, dataType: "xml"}
console.log(fn({name:"c"}));//Object {name: "c", length: 5, dataType: "xml"}
console.log(fn());//Object {name: "bar", length: 5, dataType: "xml"}
});
</script>
我们在调用fn()方法的时候,在传递的参数options对象中设置了相应的值,那么就使用设置的值,否则就使用默认值。通过使用$.extend()方法,可以很方便地用传入的参数来覆盖默认值。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>jQuery.color插件</title>
<style type="text/css">
.red{
color: red;
}
</style>
</head>
<body>
<div class="red">red</div>
<div class="blue" style="color: blue;">blue</div>
<div class="yellow" style="color:yellow;">yellow</div>
<script type="text/javascript" src="jquery-2.1.4.js"></script>
<script type="text/javascript" src="jQuery.color.js"></script>
<script type="text/javascript">
//插件应用
$(function(){
console.log($("div").color("red"));
});
</script>
</body>
</html>
jQuery.color.js
;(function($){
$.fn.extend({
"color":function(value){
return this.css("color",value);//设置字体颜色值
}
});
})(jQuery);
/*
这里给这个方法提供一个参数value,如果调用方法的时候传递了value这个参数,那么就是用这个值来设置
字体颜色,否则就是获取匹配元素的字体颜色的值
*/
推荐几篇不错的博文:
创建更好jQuery插件的10个建议
标签:
原文地址:http://blog.csdn.net/liujie19901217/article/details/51815997