zoukankan      html  css  js  c++  java
  • 再谈:jquery编写插件的方法

    编写插件的两种方式:

      1.类级别开发插件(1%)

      2.对象级别开发(99%)

    类级别的静态开发就是给jquery添加静态方法,三种方式

      1.添加新的全局函数

      2.使用$.extend(obj)

      3.使用命名空间

    类级别开发插件(用的非常少,1%)

      分别举例:

    复制代码
    //1.直接给jquer添加全局函数
    jQuery.myAlert=function (str) {
        alert(str);
    };
    
    //2.用extend()方法。extend是jquery提供的一个方法,把多个对象合并起来,参数是object
    jQuery.extend({
        myAlert2:function (str1) {
            alert(str1);
        },
        myAlert3:function () {
            alert(11111);
        }
    });
    
    //一定要注意两种类级别编写插件方式书写的区别。
    
    //3.使用命名空间(如果不使用命名空间容易和其他引入的JS库里面的同名方法冲突)
    jQuery.yuqing={
        myAlert4:function (str) {
            alert(str);
        },
        centerWindow:function (obj) {
            obj.css({
                'top':($(window).height()-obj.height())/2,
                'left':($(window).width()-obj.width())/2
            });
            //必须进行返回对象的操作,否则就不能继续往下进行链式操作了。。
            return obj;
        }
    };
    复制代码

    调用部分:

    复制代码
      //调用自定义插件方法
      $('#btn').click(function () {
          $.myAlert('我是调用jquery编写的插件弹出的警告框');
          $.myAlert2('我是调用jquery的extend()方法编写的插件弹出的警告框');
          $.myAlert3();
          $.yuqing.myAlert4("调用使用了命名空间编写的插件方法");
      });
     $.yuqing.centerWindow($('#div1')).css('background','red');
    复制代码

    注意:jquery文件要一并引入。

    对象级别开发插件(常用99%)

    jquery官方给了一套对象级别开发插件的模板:

    复制代码
    ;(function ($) {
        $.fn.plugin=function (options) {
            var defaults={
                //各种参数、各种属性
            };
    //options合并到defaults上,defaults继承了options上的各种属性和方法,将所有的赋值给endOptions var endOptions=$.extend(defaults,options); this.each(function () { //实现功能的代码 }); }; })(jQuery);
    复制代码

    模板要点:

    1.函数全部放在闭包里,外面的函数就调用不到里面的参数了,比较安全
    2.前面加分号,避免不必要的麻烦

    举个栗子:

      需求:开发一个插件,要求奇数行颜色是yellow,偶数行颜色是green,鼠标移到的行变为blue,移除变为原来的颜色

       HTML布局:

     View Code

      css样式

     View Code

      jquery调用代码:

    $('#tab').table({
        evenRowClass:'evenRow1',
        oddRowClass:'oddRow1',
        curRowClass:'curRow1',
        eventType1:'click'
    });

     jquery插件代码:

    复制代码
     1 ;(function ($) {
     2     $.fn.table=function (options) {
     3         var defaults={
     4             //各种参数、各种属性
     5             evenRowClass:'evenRow',
     6             oddRowClass:'oddRow',
     7             curRowClass:'curRow',
     8             eventType1:'mouseover',
     9             eventType2:'mouseout'
    10         };
    11         
    12         var endOptions=$.extend(defaults,options);
    13         
    14         this.each(function () {
    15             var _this = $( this );
    16             _this.find('tr:even').addClass(endOptions.evenRowClass);
    17             _this.find('tr:odd').addClass(endOptions.oddRowClass);
    18 //鼠标移入和移出,但实际开发中不直接使用mouseover这种方法 19 /*$(this).find('tr').mouseover(function () { 20 $(this).addClass(endOptions.curRowClass); 21 }).mouseout(function () { 22 $(this).removeClass(endOptions.curRowClass); 23 });*/ 24 25 //实际开发中要用bian()方法绑定 26 //因为用bind()方法绑定非常灵活,事件可以自己定义 27 //mouseover mouseout...事件底层都是用bind()去实现的,mouseout 等只是快捷方式 28 _this.find('tr').bind(endOptions.eventType1,function () { 29 $(this).addClass(endOptions.curRowClass); 30 }); 31 _this.find('tr').bind(endOptions.eventType2,function () { 32 $(this).removeClass(endOptions.curRowClass); 33 }) 34 }); 35 }; 36 })(jQuery);
    复制代码

    插件注释:

    15行:var _this = this;  变量存储,因为很多地方用到$(this);所以将其存储为变量使用更加的方便,也提高了运行效率。

    19-23行与28-33行实现的功能是相同的,但是推荐使用28-33行的写法,使用bian()进行事件的绑定,因为使用会非常的灵活。

    可变的地方,如样式名称等最好写在defaults里,方便用户自行配置。

    再来一个对象级别实现jquery插件的栗子(⊙o⊙)哦!!实现选项卡功能~~

    HTML布局

    复制代码
    <div id="tab">
        <ul id="nav">
            <li class="active">HTML</li>
            <li>CSS</li>
            <li>JAVASCRIPT</li>
        </ul>
        <div id="cont">
            <div style="display: block;">HTML</div>
            <div>CSS</div>
            <div>JAVASCRIPT</div>
        </div>
    </div>
    复制代码

    css样式:

    复制代码
    * {
        margin: 0;
        padding: 0;
    }
    
    #nav li {
        list-style: none;
        float: left;
        height: 25px;
        line-height: 25px;
        border: 1px solid #0000FF;
        border-bottom: none;
        padding: 5px;
        margin: 10px;
        margin-bottom: 0;
    }
    
    #cont div {
         210px;
        height: 150px;
        border: 1px solid #0000FF;
        margin-left: 10px;
        clear: both;
        display: none;
    }
    
    .active {
        background: #AFEEEE;
    }
    复制代码

    调用的JS代码

    <script type="text/javascript">
        $('#tab').tab({
            tabType: 'mouseover'
        });
    </script>

    注意哦:不要忘记先引入jquery.js文件喔,然后在引入我们编写的插件tab.js,才能正确调用到tab()方法。。。

    插件tab.js

    复制代码
    ;(function($) {
        $.fn.tab = function(options) {
            var defaults = {
                tabActiveClass: 'active',
                tabNav: '#nav>li',
                tabCont: '#cont>div',
                tabType: 'click'
            };
    
            var endOptions = $.extend(defaults, options);
            $(this).each(function() {
                var _this = $(this);
                _this.find(endOptions.tabNav).bind(endOptions.tabType, function() {
                    $(this).addClass(endOptions.tabActiveClass).siblings().removeClass(endOptions.tabActiveClass);
                    var index = $(this).index();
                    _this.find(endOptions.tabCont).eq(index).show().siblings().hide();
                });
            });
        };
    })(jQuery);
    复制代码

    这个小栗子和上一个表格插件的栗子相似度是很高的,多敲几遍,理解意思,其实jquery扩展插件并不难哦~~

    什么是成功?就是所有失败的路都走过了,只剩下一条路还没有走,这条路就叫成功!
  • 相关阅读:
    网络流 方阵移动
    NOI2019滚粗记
    PKUSC2019游记
    CQOI十二省联考游记
    数学结论题 书堆
    计算几何 大灾变
    51NOD 1773 A国的贸易
    BZOJ 3944
    51Nod 1238
    NOIP2018游记
  • 原文地址:https://www.cnblogs.com/libin-1/p/5814789.html
Copyright © 2011-2022 走看看