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

/**
 * 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 = { // 默认参数设置
  width: '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);
   ... ...
  });
 };

jquery插件解读之tabs的更多相关文章

  1. 第7章 jQuery插件的使用和写法

    第7章 jQuery插件的使用和写法 插件又称扩展,是一种遵循一定规范的应用程序接口写出来的程序. 插件的编写思想基于面向对象. 获取最新的插件可以查看jquery官网:http://plugins. ...

  2. 自己动手开发jQuery插件

    因为工作需要,所以这几天琢磨了一下关于jQuery插件开发的问题,经过一天鏖战,终于完成自己动手做的第一个jQuery插件,对于俺这种见了css就蛋疼菊紧的人来说,一天时间8小时,保守估计有5个小时在 ...

  3. jquery插件之tab标签页或滑动门

    该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的tab标签页或滑动门特效,在此插件中默认使用的是鼠标滑过 ...

  4. jquery插件库

    jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多javascript高手加入其team. jQuery是继prototype之后又一个优秀的Javascrīpt框架.其经典 ...

  5. 关于jquery插件 入门

    关于 JavaScript & jQuery 的插件开发   最近在温故 JavaScript 的面向对象,于是乎再次翻开了<JavaScript高级程序设计>第3版,了解到其中常 ...

  6. 强烈推荐240多个jQuery插件提供下载

    jQuery 是继 prototype 之后又一个优秀的 Javascript 框架.其宗旨是—写更少的代码,做更多的事情.它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不及 的 ...

  7. 使用自定义 jQuery 插件的一个选项卡Demo

    前几天闲着没事,想着编写一个 jQuery 插件,或许这将是一个美好的开始. 这里是html页面: <!DOCTYPE html> <html lang="en" ...

  8. 240多个jQuery插件

    概述 jQuery 是继 prototype 之后又一个优秀的 Javascript 框架.其宗旨是—写更少的代码,做更多的事情.它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不 ...

  9. 海量jQuery插件

    转自:http://blog.csdn.net/zzq58157383/article/details/6900142 提醒大家在使用的时候注意jQuery包的版本问题,最好是使用相同的版本,因为使用 ...

随机推荐

  1. case功能菜单选项

    脚本aim; 实现如下功能菜单并实现相应的功能;同在之前公司的一个游戏控制脚本; 1),显示当前时间; 2),显示cpu负载 3),显示剩余内存 0),退出脚本 如图菜单界面

  2. 解决打开visio2013提示windows正在配置的问题

    由于之前装过office2007.也装过2010版本.新安装visio2013就会出现如下情况 解决办法: 主要是要清理完visio2010及之前的那些没用选项 1.在cmd命令下打开regedit注 ...

  3. J2SE 8的输入输出--序列化

    1. 普通序列化 implements Serializable 继承Serializable接口 class Employee implements Serializable { private S ...

  4. 单网卡用双IP上内外网

    网络   2008-09-22 17:42   阅读44   评论1    字号: 大  中  小  PC机同时上内外网一例 一个公司内部,一台pc机在上内网的同时,还要求上外网,如何在一块网卡上实现 ...

  5. sqlserver查询自定义的函数

    1)sp_helptext同样适应用自定义函数 2)sys.sql_modules表也可以查 查看函数的源代码: exec sp_helptext '函数名'

  6. Session的作用和使用场景

    1.session何时被创建? 客户首次访问服务器时,回话session对象被创建并分配一个唯一的Id,同时id号发送到客户端,并存入cookie,使得客户端session对象和服务器端一致. 2.如 ...

  7. js 获取字符串的 像素 宽度 ----字符串格式化输出

    function getLenPx(str, font_size) { var str_leng = str.replace(/[^\x00-\xff]/gi, 'aa').length; retur ...

  8. php socket 函数

    创建基于socket的应用程序,就需要详细了解socket的操作方法,这里列举PHP中一些重要的socket函数.   1. socket_create ( int $domain , int $ty ...

  9. zg 作业一

    作业一: 将xxjjT01增加窗体及按钮(增.修.删) 表单(form1.html) 设定按钮作业,授权 1.新增:XXJJT01+CREATE 2.修改:XXJJT01+UPDATE 3.删除:XX ...

  10. 真机IOS8.3以上的文件夹共享

    ios8.3以上的版本,苹果规定需要验证身份,将不在默认开启文件共享,但是在实际测试工作中,提取文件是经常需要做的操作,笔者在使用GT采集性能数据后,通过itoos或itunes都无法获得目标app的 ...