写第一个jquery插件实录

插件的功能很简单,就只是点击一个图片,图片在弹出框出现,后面有个背景层。由于CSS,HTML的各种基础都一般,学js刚14天,所以写这个还是花了点时间。

首先是结构,img文件夹里放需要的图片。index.html除了引用需要的js文件以及css文件之外,还需要写入图片的html代码。

<a href="img/caicai.jpg" title="Ashida1" class="thumbnail"><img src="img/caicai.jpg"/></a>

main.js里写调用插件的代码:

$(document).ready(function(){
    $(".thumbnail").otBox({
    });
});

这里所有thumbnail类都能调用otBox方法,于是要定义otBox方法,而且要把otBox方法定义在jQuery的原型中,这样所有的jQuery实例都能使用。所以otBox.js里面有$.fn.otBox = function(options){}的方法,详细如下:

    $.fn.otBox = function(options){
        var $this = this;
        var options = $.extend({},$.fn.otBox.defaults,options);

        $this.each(function(){

            Object.create(otBox).init($(this),options);
        });
    };
 

这里的$this指的是调用这个插件的由选择器选择出来的对象数组,比如在main里使用$(".thumbnail")选择了所有这个类的<a>元素,对于每一个<a>,都能进行插件的功能。于是在$.fn.otBox函数里,对数组里的每一个对象都进行了插件功能的初始化。初始化的时候需要将调用otBox的jQuery实例传入,即每一个<a>元素,也就是each里面的this,用$()封装成jQuery。由于在$(".thumbnail").otBox({});中,所有选择出来的元素享用同一组options参数(有默认参数,用户也可以自己传参),因此在each前就可以对options进行统一合并。使用jQuery中的extend方法,将$.fn.otBox.defaults(默认)和options(用户传入)一起合并到{}里面,传给var options。

Object.create(object)方法生成一个object的实例方法,它的内部like this:

        Object.create = function (pro){
            function F(){};
            F.prototype = pro;
            return new F();
        }

init是otBox的初始化函数。现在我们来看看otBox对象的定义:

    var otBox = {
        init:function(instance,options){
            this.instance=instance;//instance指的是调用otBox的jQuery实例,而this是otBox实例
            this.options=options;
            var $this=this;

//            生成bg和showbox的html部分
            var $showBox= $("<div class='show_box'><img src='' alt=''/></div><div class='bg_lock'></div>");
            $('body').append($showBox);


            this.instance.on('click',function(e){
                e.preventDefault();
//                console.log(this); 
                $this.showBg();
                $this.showBox(this['href']);
            });

            $('.bg_lock').click(function(){
                $this.hideBox();
                $this.hideBg();
            });

        },
        showBg: function(){
            $('.bg_lock').show();
        },
        showBox: function(url){
            $('.show_box>img').attr('src',url);
            $('.show_box').show();
        },
        hideBg:function(){
            $('.bg_lock').hide();
        },
        hideBox:function(){
            $('.show_box>img').attr('src','');
            $('.show_box').hide();
        }
    };

主要是init部分,这里之所以要传入之前调用otBox的jQuery实例,是因为在init里面会绑定对实例的click方法,于是需要知道是哪个<a>被click了,弹出对应的图片。而在init里面的this指的是otBox实例。先在init里面在把弹出层和背景层的html动态添加到页面中,因为总不能让用户手动来填这部分html代码吧。然后,定义click事件,绑定在调用otBox的那个jQuery实例上,也就是传进来的instance。首先防止默认行为,也就是对a的跳转,然后分别show背景和弹出层,在弹出层的时候,把所需图片的url传入。在这个事件绑定函数中,由于this变成了click绑定的dom对象,也就是<a>元素,于是直接使用this['href']就可以取出图片的url。而showBg()等函数都需要otBox实例才能调用,所以用的是$this。

其余函数只是为了实现弹出层和背景层的出现和消失。

附上otBox的css文件,里面有关于弹出层和背景图的基本css实现:

a.thumbnail img{
    width:200px;

}

.bg_lock{
    display: none;
    height:100%;
    width: 100%;
    position:absolute;
    top:0%;
    left:0%;
    background-color: black;
    z-index:1000;
    opacity: 0.5;
}

.show_box{
    position: absolute;
    top: 10%;
    left: 25%;
    width:50%;
    z-index: 1001;


}

.show_box>img{
    width:100%;
    border-radius: 12px;
}
otBox.css

哇!最后展示下我的小菜菜!

 

附上otBox.js文件

/**
 * Created by OT on 14-1-6.
 */
(function ($){

    if( typeof Object.create !== 'function'){
        Object.create = function (pro){
            function F(){};
            F.prototype = pro;
            return new F();
        }
    };

    var otBox = {
        init:function(instance,options){
            this.instance=instance;//instance指的是调用otBox的jQuery实例,而this是otBox实例
            this.options=options;
            var $this=this;

//            生成bg和showbox的html部分
            var $showBox= $("<div class='show_box'><img src='' alt=''/></div><div class='bg_lock'></div>");
            $('body').append($showBox);

            this.instance.on('click',function(e){
                e.preventDefault();
                $this.showBg();
                $this.showBox(this['href']);
            });

            $('.bg_lock').click(function(){
                $this.hideBox();
                $this.hideBg();
            });

        },
        showBg: function(){
            $('.bg_lock').show();
        },
        showBox: function(url){
            $('.show_box>img').attr('src',url);
            $('.show_box').show();
        },
        hideBg:function(){
            $('.bg_lock').hide();
        },
        hideBox:function(){
            $('.show_box>img').attr('src','');
            $('.show_box').hide();
        }
    };

    $.fn.otBox = function(options){
        var $this = this;
        var options = $.extend({},$.fn.otBox.defaults,options);

        $this.each(function(){

            Object.create(otBox).init($(this),options);
        });
    };

    $.fn.otBox.defaults = {};

})(jQuery);
otBox.js

这里首先是自执行函数,为了避免污染全局,所以用函数封装,为了让里面的代码执行一遍,于是把函数设成自执行,之所以要传jQuery进去,是怕有其他地方也有定义$,所以为了确保在otBox文件中使用的$就是jQuery,传了这个参数进去。函数里面第一部分是由于可能低版本的jQuery还不支持Object.create(),所以手动定义一下。

 

posted @ 2014-01-09 13:52  OT元旦  阅读(296)  评论(0编辑  收藏  举报