jQuery插件扩展

jQuery写插件核心方法

核心方法两个:
.extend(object)jQuery .fn.extend(object) 为jQuery实例添加一个方法

$.extend({
    fun1:function(){
    }
});
//Usage
$.fun1(); 

$.fn.extend({
    fun2:function(){
    //console.log()
    }
});
//Usage
$(this).fun2();

区分 (function()...)(function( ){})(jQuery)

第一个是表示DOMReady执行里面的方法,也就是我们通过使用jQuery所必须加的那个方法。

$(function(){
    //jQuery code here
})

而第二个写法是定义了一个匿名函数,并且传入jQuery作为参数,在jQuery插件开发中很重要,定义了插件的私有作用域!
我自己写的插件就是这样定义的:

(function(jQuery,WebUploader){
    var $=jQuery;
    $.fn.createUpload=createUpload;
})(jQuery,WebUploader);

开发jQuery插件的标准结构

1.定义作用域:定义一个jQuery插件,首先把这个插件的代码放在一个不受外界干扰的地方。外部的代码不能直接访问插件内部的代码。插件内部的代码不污染全局变量。在一定的作用上解耦了插件与运行环境的依赖。
其实也就是IIFE立即执行函数,同时也是一个闭包,你会发现,我们把私有作用域中的createUpload方法添加到了$.fn上

//step01 定义插件的私有作用域
(function ($) {

})(jQuery);

2 . 扩展这个插件,当定义好整个作用域后,就是为这个jQuery实例添加一个扩展方法。

(function(jQuery){
    var $=jQuery;
    $.fn.createUpload=function(options){
    };
})(jQuery);

我们当然可以在调用这个方法的时候传入一些参数,配置这个方法。这就是一个最简单的jQuery插件。

Usage

如果这个插件是为jQuery实例定义的,那么使用方法如下:

$('#domName').createUpload(options);

如果你设置为静态方法:

$.createUpload(options);

插件应该有默认值

插件应该是有比较灵活的属性,同时也应该有默认值。所以我们一般会在插件定义时设定一些默认值
同时为了灵活我们应该使用变量,用户传入了自己的设置参数的时候就应该使用用户的设置值:

 function initUploader(options){
        if(!isObject(options)){
                console.log("error! it is not an object!");
                return ;
        }
        else if(!WebUploader.Uploader.support()){
            var error="上传组件不支持你的浏览器!请使用Chrome!";
            alert(error);
            return ;
        }
        else{
            //render the html first!
            render(options); //render the html dom
            //common setting
            var settings={
                    method:'POST',
                    // swf文件路径
                    swf:swf,
                    // 文件接收服务端。
                    server:options.serverPath,
                    // 选择文件的按钮。可选。
                    // 内部根据当前运行是创建,可能是input元素,也可能是flash.
                    fileSizeLimit:options.fileSizeLimit||536870912,  //默认500MB 单位Byte 
                    pick: '#'+picker, // picker id 
                    chunked:true,
                    chunkRetry:options.chunkRetry||3,
                    chunkSize:options.chunkSize||102400  //单位 Byte
            };
            if(options.type==='img'){
                settings['auto'] = true;
                settings['accept']={
                    title:imgTitle,
                    extensions:extendsion,
                    mimeTypes:'image/*'
                };
            }else if(options.type==='file'){
                settings['resize']=false;
            }
            var uploader=WebUploader.create(settings);
        }
        return uploader;
    }

我们可以看到我们实际是使用用户传入的option参数来配置我们的参数。
还有一种方法:

(function ($) {
    var defaults = {
        prevId: 'prevBtn',
        prevText: 'Previous',
        nextId: 'nextBtn',
        nextText: 'Next'
        //……
    };

    $.fn.createUpload= function (options) {

        var options = $.extend(defaults, options);
    }
})(jQuery);

使用$.extend(defaults,options); 表示options取覆盖defaults的值,并把值赋给新定义的options了。
这个也是如果用户定义了属性就覆盖,未定义就覆盖。

让插件支持jQuery选择器

如果有必要你应该让你的插件支持jQuery选择器

(function(jQuery){
    var defaults={
    };
    var $=jQuery;
    $.fn.createUpload=function(options){
        //合并用户自定义属性,默认属性
        var options=$.extend(defaults,options);

        this.each(function(){
        });
    };

})(jQuery);

所以就是this.each 这个方法。
那么插件就可以使用这个方法遍历执行选择到的所有元素。

关于$.extend 和 $.fn.extend

实际上,fn只是对jQuery.prototype的一个引用。
但其实

jQuery.extend=jQuery.fn.extend=function(){
//..
}

所以它其实是指向同一个方法的不同引用而已。
即jQuery.extend 对jQuery本身的属性和方法进行了扩展
jQuery.fn.extend 对jQuery.fn的属性和方法进行了扩展

但是为什么jQuery.fn和jQuery.的效果不同?

其实是因为 .extendthisjQueryjQuery .fn.extend调用的时候this是指向fn对象,所以扩展的是jQuery.prototype对象

支持链式调用

其实就是最后return this!

(function(jQuery){
    var defaults={
    };
    var $=jQuery;
    $.fn.createUpload=function(options){
        //合并用户自定义属性,默认属性
        var options=$.extend(defaults,options);

        //支持链式调用
        return this.each(function(){
        });

    };

})(jQuery);

用法

$(".div").createUpload({prevId:"",prevText:""}).css({ "border-width": "1", "border-color": "red", "border-bottom-style": "dotted" });

插件中定义方法

(function(jQuery){
    var defaults={
    };
    var $=jQuery;
        //文本节点,兼容性的处理. IE innerText   FF没有innerText
    function textContent(element,value){
        var content=element.textContent; //检测textContent是否有定义
        if(value==undefined){ //没有传递value 返回当前文本
            if(content!==undefined) return content;
            else return element.innerText;
        }
        else{
            if(content!==undefined) element.textContent=value;
            else element.innerText=value;
        }

    }
    $.fn.createUpload=function(options){
        //合并用户自定义属性,默认属性
        var options=$.extend(defaults,options);

        this.each(function(){
        });
    };

})(jQuery);

直接写在私有作用域里面即可,在插件里面定义的方法,外界不能直接调用。这些方法都是在内部被使用。 如果你希望外界能够访问你这个方法。你就要挂载到
$.extend上作为静态方法 或者 $.fn.extend作为实例方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值