上面几节就 jQuery 插件的创建方法进行了详细讲解,一般对外发布的自定义插件都应该进行封装,封装的插件还应该符合规范,只有这样所创建的插件才具有推广价值,并得到其他用户的喜爱。
封装 jQuery 插件的第一步是定义一个独立域,代码如下所示。
- <scripttype="text/javascript">
- (function($){
- //自定义插件代码
- })(jQuery);//封装插件
- $.extend($.fn,{//jQuery对象方法扩展
- //函数列表
- });
- })(jQuery);//封装插件
- (function($){
- $.extend($.fn,{//jQuery对象方法扩展
- color:function(options){//自定义插件名称
- varoptions=$.extend({//参数选项对象处理
- bcolor:"white",//背景色默认值
- fcolor:"black"//前景色默认值
- },options);
- //函数体
- }
- });
- })(jQuery);//封装插件
- (function($){
- $.extend($.fn,{//jQuery对象方法扩展
- color:function(options){//自定义插件名称
- varoptions=$.extend({//参数选项对象处理
- bcolor:"white",//背景色默认值
- fcolor:"black"//前景色默认值
- },options);
- returnthis.each(function(){//返回匹配的jQuery对象
- $(this).css("color",options.fcolor);//遍历设置每个DOM元素的字体颜色
- $(this).css("backgroundColor",options.bcolor);//遍历设置每个DOM元素的背景色
- });
- }
- });
- })(jQuery);//封装插件
- <scripttype="text/javascript">
- (function($){
- $.extend($.fn,{
- color:function(options){//自定义插件名称
- varoptions=$.extend({//参数选项对象处理
- bcolor:"white",//背景色默认值
- fcolor:"black"//前景色默认值
- },options);
- returnthis.each(function(){//返回匹配的jQuery对象
- $(this).css("color",options.fcolor);//遍历设置每个DOM元素的字体颜色
- $(this).css("backgroundColor",options.bcolor);//遍历设置每个DOM元素的背景颜色
- });
- }
- });
- })(jQuery);//封装插件
- $(function(){//页面初始化
- $("h1").color({//设置标题的前景色和背景色
- bcolor:"#eea",
- fcolor:"red"
- });
- });
- $.extend($.fn,{
- color:function(options){
- varoptions=$.extend({},$.fn.color.defaults,options);
- returnthis.each(function(){//返回匹配的jQuery对象
- $(this).css("color",options.fcolor);//遍历设置每个DOM元素的字体颜色
- $(this).css("backgroundColor",options.bcolor);//遍历设置每个DOM元素的背景颜色
- });
- }
- });
- $.fn.color.defaults={//独立设置$.fn.color对象的默认参数值
- bcolor:"white",
- fcolor:"black"
- };
- })(jQuery);//封装插件
- $(function(){//页面初始化
- $("h1").color({//设置标题的前景色和背景色
- bcolor:"#eea",
- fcolor:"red"
- });
- });
- $.extend($.fn,{
- color:function(options){
- varoptions=$.extend({},$.fn.color.defaults,options);
- returnthis.each(function(){//返回匹配的jQuery对象
- $(this).css("color",options.fcolor);//遍历设置每个DOM元素的字体颜色
- $(this).css("backgroundColor",options.bcolor);//遍历设置每个DOM元素的背景颜色
- });
- }
- });
- $.fn.color.defaults={//独立设置$.fn.color对象的默认参数值
- bcolor:"white",
- fcolor:"black"
- };
- })(jQuery);//封装插件
- $(function(){//页面初始化
- $.fn.color.defaults={//预设默认的前景色和背景色
- bcolor:"#eea",
- fcolor:"red"
- };
- $("h1").color();
- $("p").color({bcolor:"#fff"});//为段落文本设置默认色,同时覆盖背景色为白色
- $("div").color();//为盒子设置默认色
- });
- //扩展方法
- };
例如,继续以上一节的示例为基础,我们为其添加一个格式化的扩展功能,这样用户在设置颜色的同时,还可以根据需要适当进行格式化功能设计,如加粗、斜体、放大等功能操作。扩展的 color() 插件代码如下所示。
- (function($){
- $.extend($.fn,{
- color:function(options){
- varoptions=$.extend({},$.fn.color.defaults,options);//覆盖原来参数
- returnthis.each(function(){
- $(this).css("color",options.fcolor);
- $(this).css("backgroundColor",options.bcolor);
- var_html=$(this).html();//获取当前元素包含的HTML字符串
- _html=$.fn.color.format(_html);//调用格式化功能函数对其进行格式化
- $(this).html(_html);//使用格式化的HTML字符串重写当前元素内容
- });
- }
- });
- $.fn.color.defaults={//独立设置$.fn.color对象的默认参数值
- bcolor:"white",
- fcolor:"black"
- };
- $.fn.color.format=function(str){//开放的功能函数
- returnstr;
- }
- })(jQuery);//封装插件
例如,下面的示例调用了 color() 插件,同时在调用时分别扩展了它的格式化功能。
- <scripttype="text/javascript">
- (function($){
- $.extend($.fn,{
- color:function(options){
- varoptions=$.extend({},$.fn.color.defaults,options);//覆盖原来参数
- returnthis.each(function(){
- $(this).css("color",options.fcolor);
- $(this).css("backgroundColor",options.bcolor);
- var_html=$(this).html();//获取当前元素包含的HTML字符串
- _html=$.fn.color.format(_html);//调用格式化功能函数对其进行格式化
- $(this).html(_html);//使用格式化的HTML字符串重写当前元素内容
- });
- }
- });
- $.fn.color.defaults={//独立设置$.fn.color对象的默认参数值
- bcolor:"white",
- fcolor:"black"
- };
- $.fn.color.format=function(str){//开放的功能函数
- returnstr;
- }
- })(jQuery);//封装插件
- $(function(){//页面初始化
- $.fn.color.defaults={//预设默认的前景色和背景色
- bcolor:"#eea",
- fcolor:"red"
- };
- $.fn.color.format=function(str){//扩展color()插件的功能,使内部文本加粗显示
- return"<strong>"+str+"
- $.extend($.fn,{
- color:function(options){
- if(!filter(options))//调用隐私方法验证参数,不合法则返回
- returnthis;
- varoptions=$.extend({},$.fn.color.defaults,options);//覆盖原来参数
- returnthis.each(function(){
- $(this).css("color",options.fcolor);
- $(this).css("backgroundColor",options.bcolor);
- var_html=$(this).html();//获取当前元素包含的HTML字符串
- _html=$.fn.color.format(_html);//调用格式化功能函数对其进行格式化
- $(this).html(_html);//使用格式化的HTML字符串重写当前元素内容
- });
- }
- });
- $.fn.color.defaults={//独立设置$.fn.color对象的默认参数值
- bcolor:"white",
- fcolor:"black"
- };
- $.fn.color.format=function(str){//开放的功能函数
- returnstr;
- }
- functionfilter(options){//定义隐私函数,外界无法访问
- //如果参数不存在,或者存在且为对象,则返回true,否则返回false
- return!options||(options&&typeofoptions==="object")?true:false;
- }
- })(jQuery);//封装插件
- $(function(){//页面初始化
- $.fn.color.defaults={//预设默认的前景色和背景色
- bcolor:"#eea",
- fcolor:"red"
- };
- $.fn.color.format=function(str){//扩展color()插件的功能,使内部文本加粗显示
- return"<strong>"+str+"
- $("p").color("#fff");
- });
在特定情况下,jQuery 对象方法可能会修改 jQuery 对象匹配的 DOM 元素,这时就有可能破坏方法返回值的一致性。为了遵循 jQuery 框架的核心设计理念,我们应该时刻警惕任何修改 jQuery 对象的操作。
例如,定义一个 jQuery 对象方法 parent() ,用来获取 jQuery 匹配的所有 DOM 元素的父元素。实现代码如下。
- <scripttype="text/javascript">
- (function($){
- $.extend($.fn,{
- parent:function(){//扩展jQuery对象方法,获取所有匹配元素的父元素
- vararr=[];
- $.each(this,function(index,value){//遍历匹配的DOM元素
- arr.push(value.parentNode);//把匹配元素的父元素推入临时数组
- });
- arr=$.unique(arr);//在临时数组中过滤重复的元素
- returnthis.setArray(arr);//把变量arr打包为数组类型返回
- }
- });
- })(jQuery);//封装插件
- $.extend($.fn,{
- parent:function(){//扩展jQuery对象方法,获取所有匹配元素的父元素
- vararr=[];
- $.each(this,function(index,value){//遍历匹配的DOM元素
- arr.push(value.parentNode);//把匹配元素的父元素推入临时数组
- });
- arr=$.unique(arr);//在临时数组中过滤重复的元素
- returnthis.setArray(arr);//把变量arr打包为数组类型返回
- }
- });
- })(jQuery);//封装插件
- $(function(){
- var$p=$("p");//获取所有p元素,并存储到变量$p中
- $p.parent().css("border","solid1pxred");//调用parent()方法获取p元素的父元素,并设置它们的边框样式
- });
- var$p=$("p");//获取所有p元素,并存储到变量$p中
- $p.parent().css("border","solid1pxred");//调用parent()方法获取p元素的父元素,并设置它们的边框样式
- $p.hide();//隐藏所有p元素,即当前jQuery对象
- });
上面示例仅仅是破坏性操作的一种表现,如果要避免此类隐性修改 jQuery 对象的行为,建议采用非破坏性操作。例如,在本例中我们可以使用 pushStack() 方法创建一个新的 jQuery 对象,而不是修改 this 所引用的 jQuery 对象,这样可以避免破坏性操作行为,同时 pushStack() 方法还允许调用 end() 方法操作新创建的 jQuery 对象方法。把上面的示例的 jQuery 对象方法进行优化,代码如下所示。
- <scripttype="text/javascript">
- (function($){
- $.extend($.fn,{
- parent:function(options){//扩展jQuery对象方法,获取所有匹配元素的父元素
- vararr=[];
- $.each(this,function(index,value){//遍历匹配的DOM元素
- arr.push(value.parentNode);//把匹配元素的父元素推入临时数组
- });
- arr=$.unique(arr);//在临时数组中过滤重复的元素
- returnthis.pushStack(arr);//返回新创建的jQuery对象,而不是修改后的当前jQuery对象
- }
- });
- })(jQuery);//封装插件
- $(function(){
- var$p=$("p");//获取所有p元素,并存储到变量$p中
- $p.parent().css("border","solid1pxred");//调用parent()方法获取p元素的父元素,并设置它们的边框样式
- $p.hide();//隐藏所有p元素,即当前jQuery对象
- });
- var$p=$("p");//获取所有p元素,并存储到变量$p中
- $p.parent().css("border","solid1pxred").end().hide();
- });