zoukankan      html  css  js  c++  java
  • jquery插件解读之tabs

    先上代码,符简略关键性说明:

    /**
     * jQuery EasyUI 1.4.1
     *
     * Copyright (c) 2009-2014 www.jeasyui.com. All rights reserved.
     *
     * Licensed under the GPL license: http://www.gnu.org/licenses/gpl.txt
     * To use it on other terms please contact us at info@jeasyui.com
     *
     */
    /**
     * tabs - jQuery EasyUI
     *
     * Dependencies:
     *   panel
     *   linkbutton
     *
     */
    (function($){
     ...... //你懂,此处省略很多字!
     function addTools(container){ //这些都是公共的处理方法,不过仅限内部调用。自己开发时,可以根据需求情况,定义不同的方法。
      var opts = $.data(container, 'tabs').options;
      var header = $(container).children('div.tabs-header');
      if (opts.tools) {
       if (typeof opts.tools == 'string'){
        $(opts.tools).addClass('tabs-tool').appendTo(header);
        $(opts.tools).show();
       } else {
        header.children('div.tabs-tool').remove();
        var tools = $('<div class="tabs-tool"><table cellspacing="0" cellpadding="0" style="height:100%"><tr></tr></table></div>').appendTo(header);
        var tr = tools.find('tr');
        for(var i=0; i<opts.tools.length; i++){
         var td = $('<td></td>').appendTo(tr);
         var tool = $('<a href="javascript:void(0);"></a>').appendTo(td);
         tool[0].onclick = eval(opts.tools[i].handler || function(){});
         tool.linkbutton($.extend({}, opts.tools[i], {
          plain: true
         }));
        }
       }
      } else {
       header.children('div.tabs-tool').remove();
      }
     }
     ...... //你懂,此处省略很多字!
     
     $.fn.tabs = function(options, param){
      if (typeof options == 'string') { // 这便是api解析器啦~(≧▽≦)/~,根据参数类型,判断是初始化插件还是调用api。
       return $.fn.tabs.methods[options](this, param);
      }
      
      options = options || {};
      return this.each(function(){
       var state = $.data(this, 'tabs');
       if (state) {
        $.extend(state.options, options);
       } else {
        $.data(this, 'tabs', {
         options: $.extend({},$.fn.tabs.defaults, $.fn.tabs.parseOptions(this), options),
         tabs: [],
         selectHis: []
        });
        wrapTabs(this);
       }
       
       addTools(this);
       setProperties(this);
       setSize(this);
       bindEvents(this);
       
       doFirstSelect(this);
      });
     };
     
     $.fn.tabs.methods = { //这些是提供给外部使用的api,其实也是只供内部调用,只不过插件根据传入的参数,解析执行不同方法而已。
      options: function(jq){
       var cc = jq[0];
       var opts = $.data(cc, 'tabs').options;
       var s = getSelectedTab(cc);
       opts.selected = s ? getTabIndex(cc, s) : -1;
       return opts;
      },
      tabs: function(jq){
       return $.data(jq[0], 'tabs').tabs;
      },
      resize: function(jq, param){
       return jq.each(function(){
        setSize(this, param);
        setSelectedSize(this);
       });
      },
      add: function(jq, options){
       return jq.each(function(){
        addTab(this, options);
       });
      },
      close: function(jq, which){
       return jq.each(function(){
        closeTab(this, which);
       });
      },

     ...... //你懂,此处省略很多字!
     };
     
     $.fn.tabs.parseOptions = function(target){
      return $.extend({}, $.parser.parseOptions(target, [
       'tools','toolPosition','tabPosition',
       {fit:'boolean',border:'boolean',plain:'boolean',headerWidth:'number',tabWidth:'number',tabHeight:'number',selected:'number',showHeader:'boolean'}
      ]));
     };
     
     $.fn.tabs.defaults = { // 默认参数设置
       'auto',
      height: 'auto',

      ...... //你懂,此处省略很多字!
      onUpdate: function(title, index){},
      onContextMenu: function(e, title, index){}
     };
    })(jQuery);

    经过上面简单介绍,那我们总结下:

    1、插件中的处理方法种类(都是服务核心结构的)

      有两种:一是仅供内部实现使用,和我们正常js方法申明一样 function  xxx(){ ... ... };

          二是作为api供外部调用,一般申明形式为 var metheds = {add:function(container){

                                      //container为jquery对象

                                      return container.each(function(){

                                      // return container.each()这样写是为了维护链式
                                        ... ...
                                        }); 

                                     },

                                      del:function(container,param){

                                       ... ...

                                     },

                                                                                                   setSize:function(container,option){

                                        // option一般是 {key1:val1,key2:val2,... ... }

                                     }

                                      ... ...

                                                                                                  }

          为什么如此定义捏?其实也没什么深意,方便下面的核心结构调用呗!

    2、插件的核心结构

     $.fn.tabs = function(options, param){
      if (typeof options == 'string') { // 这便是api解析器啦~(≧▽≦)/~,根据参数类型,判断是初始化插件还是调用api。
       return $.fn.tabs.methods[options](this, param);
      }
      
      options = options || {};
      return this.each(function(){
       var state = $.data(this, 'tabs');
       if (state) {
        $.extend(state.options, options);
       } else {
        $.data(this, 'tabs', {
         options: $.extend({},$.fn.tabs.defaults, $.fn.tabs.parseOptions(this), options),
         tabs: [],
         selectHis: []
        });
        wrapTabs(this);
       }
       
       addTools(this);
       ... ...
      });
     };

  • 相关阅读:
    php中常见的大坑,开发中应尽量避免
    ElasticSearch快速入门【建议收藏】
    OWASP Secure Headers Project
    专科是文科,是否可以报考理科的本科
    一网通办 下载发票
    “次幂”和“次方”有什么区别?
    详讲口诀“奇变偶不变,符号看象限”
    成考数学知识点 高起专
    如何下载腾讯课堂的视频
    JDK发布版本的总结
  • 原文地址:https://www.cnblogs.com/xtreme/p/4989223.html
Copyright © 2011-2022 走看看