zoukankan      html  css  js  c++  java
  • 写第一个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(),所以手动定义一下。

  • 相关阅读:
    30+简约时尚的Macbook贴花
    20+非常棒的Photoshop卡通设计教程
    20+WordPress手机主题和插件【好收藏推荐】
    75+精美的网格网站设计欣赏
    TopFreeTheme精选免费模板【20130629】
    45个有新意的Photoshop教程和技巧
    30个高质量的旅游网站设计
    55个高质量的Magento主题,助你构建电子商务站点
    一个弹框引起的彻夜加班
    开始跟踪Redis啦,开帖
  • 原文地址:https://www.cnblogs.com/yuanting0505/p/3512098.html
Copyright © 2011-2022 走看看