jquery学习(四)-如何书写自定义的jquery插件

来自锋利的jquery第二版

下面我们开始介绍如何通过现有的方法和函数,封装出既符合自己需求,有高效的插件。

  Jquery插件公分为3类,分别为:封装对象方法的插件、封装全局函数的插件、自定义选择器插件,在介绍插件的三种类型之前,我们先来了解书写插件的基本要点(这里转自aspwzmuma和锋利的jquery):

a.插件的文件命名推荐遵循jQuery.[插件名].js的规则,以便于与其他的js文件的区分,如新插件文件jquery.newplugin.js.

b.对象级别插件,所有的方法都应依附于jquery.fn主体对象;类级别插件,所有的方法都应依附于jquery对象

c.插件的内部,this所代表的是通过jQuery选择器所获取的对象,不像一般方法那样。如:click()方法,内部this指向的是绑定click的DOM对象。

d.可以通过$.each来遍历所有的元素。

e.无论是对象级别还是类级别插件,结尾都必须以分号结束,否则,在文件被压缩时,会出现错误提示信息.为了避免不要的麻烦,我们可以在插件的开头加上分号。

f.插件应该返回一个jquery对象,以保证可以链式操作。除非插件是需要返回字符串或数字等等量的参数。

g.插件内避免使用$作为jquery对象的别名,而是应该使用完整的Jquery来表示。这样做可以避免冲突。但是,如果坚持$也可以,我们可以通过闭包的方式来规避这个问题。

如以下代码:

;(function($){

Var foo;

Var bar=function(){

 

}

$.bar=bar;

})(jQuery)

h.jquery提供了两种用于拓展jquery功能的方法。第一种方法$.fn.extend(),适用于创建第一种类型的插件,第二种方法$.extend(),适用于后两种插件。

1、封装对象方法的插件

何为封装对象方法的插件呢?说白了就是将对象方法封装起来,然后可以通过jquery选择器获取的对象进行操作,如$(“element”).action(),这个action就是封装的对象,类似jqueryparent()addClass()方法。代码如下:

;(function($){
    $.fn.extend({
        //颜色设置
        "color":function(value){
            return this.css("color",value);
        }
        //表格隔行变色,选中高亮显示(checkBox选中,颜色高亮)
        ,"table":function(options){
            options= $.extend({
                odd:"odd",
                even:"even",
                selected:"selected"
            },options);
            $("tbody>tr:odd",this).addClass(options.odd);
            $("tbody>tr:even",this).addClass(options.even);
            $("tbody>tr",this).click(function(){
            var hasSelected=$(this).hasClass(options.selected);
                 $(this)[hasSelected?"removeClass":"addClass"](options.selected)
                    .find(":checkbox").prop("checked",!hasSelected);
            });
            //如果单选框默认是选中的状态,则该行高亮显示
            $("tbody>tr:has(:checked)",this).addClass(options.selected);
            return this;  //返回this,使得方法可链
        }

    });
})(jQuery)

//调用

$(“div”).color(“red”);

$(“table”).table({

odd:"odd",
         even:"even",
         selected:"selected"
});

 

 

2、封装全局函数的插件

这类插件是在jQuery名空间里面添加的一个函数,下面以去除字符串左边或右边空格为例,代码如下:

;(function($){
    $.extend({
        ltrm:function(value){
            return (value || "").replace(/^\s/g,"");
        },
        rtrim:function(value){
            return (value || "").replace(/\s+$/g,"");
        }
    });
})(jQuery)

//调用

Var str1=$.ltrm(str);

 

3、自定义选择器插件

尽管jQuery的选择器已经很强大,但是不代表其已经尽善尽美,开发者有时候需要一些符合自己需求的强大选择器。这是jquery提供的用户可自定义选择器的方法就发挥了很大作用,使得jquery选择器功能更加完善。废话不多说了,直接上代码:

;(function($) {

$.extend(jQuery.expr[":"], {

between : function( a , i ,m ) {

         //将传递进来的m[3]以逗号为分隔符,切成一个数组

var tmp=m[3].split(","); 

return tmp[0]-0<i&&i<tmp[1]-0;

}

});

})(jQuery);

这里a指向的是当前遍历到的DOM元素;i指的是当前遍历到DOM元素的索引值,从0开始的;mjquery正则解析引擎进一步解析后的产物,返回的是一个数组,下面我们以$(“div:gt(1)”)为例解析m参数:
m[0]jquery要进一步匹配的内容,‘gt(1);

m[1]选择器的引导符,上面例子中为冒号‘:’,用户可以自定义引导符;

m[2]要调用的选择器函数,例子中是gt()函数;

m[3]表示选择器函数的参数。

posted on 2015-12-08 22:06  菜鸟阿文  阅读(343)  评论(0编辑  收藏  举报