先看bootstrap.button.js的结构

var Button = function ( element, options ){} //构造器
Button.prototype = {} //构造器的原型
$.fn.button = function ( option ){} //jQuery原型上的自定义方法
$.fn.button.defaults = {} //默认参数
$.fn.button.Constructor = Button //重写jQuery原型自定义方法的构造器名
$(function (){}) // 初始化

HTML结构

<table class="table table-bordered table-striped">
<tbody>
<tr>
<td>状态</td>
<td><button id="fat-btn" class="btn btn-primary" data-loading-text="loading..."> 载入状态 </button></td>
</tr>
<tr>
<td>单独开关</td>
<td><button class="btn btn-primary" data-toggle="button">单独开关</button></td>
</tr>
<tr>
<td>复选</td>
<td>
<div class="btn-group" data-toggle="buttons-checkbox">
<button class="btn btn-primary">左</button>
<button class="btn btn-primary">中</button>
<button class="btn btn-primary">右</button>
</div>
</td>
</tr>
<tr>
<td>单选</td>
<td>
<div class="btn-group" data-toggle="buttons-radio">
<button class="btn btn-primary">左</button>
<button class="btn btn-primary">中</button>
<button class="btn btn-primary active">右</button>
</div>
</td>
</tr> </tbody>
</table>

这个例子有点问题,因为初始化时,第一个按钮没有绑定事件,所以第一个按钮不可用,不过没关系,读完源码之后,我们尝试将它补全。

/*
* 初始化
* 这里初始化了拥有data-toggle^='button'属性的对象,注意^,只要存在button字符串就可以匹配成功。
* */
$(function () {
$('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
var $btn = $(e.target)
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
$btn.button('toggle')//进入jQuery的原型方法button中
})
})

像单独一个开关,直接本身就有btn类,像单选按钮,触发的是div里面的button,寻找最近的拥有.btn类的对象,就是自己。进入jQuery原型的button方法中。

/*
* jQuery原型上的自定义方法
* */
$.fn.button = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('button')
, options = typeof option == 'object' && option
if (!data) $this.data('button', (data = new Button(this, options)))//实例化构造器
if (option == 'toggle') data.toggle() //执行toggle方法
else if (option) data.setState(option)
})
}

初始化,传入参数为toggle,默认执行原型上的toggle方法。先实例化

/*
* 构造器
* */
var Button = function ( element, options ) {
this.$element = $(element)
this.options = $.extend({}, $.fn.button.defaults, options)//合并默认参数
}

进入原型上的toggle方法

toggle: function () {
var $parent = this.$element.parent('[data-toggle="buttons-radio"]') //如果父节点有该属性,则表示只能允许
//一个按钮显示被按效果
/*
* 跟之前总结的方式,先所有删除,最后那个点击那个显示效果
* */
$parent && $parent
.find('.active')
.removeClass('active') this.$element.toggleClass('active')//核心方法,通过active类样式控制btn的显示效果
}

核心竟是jQuery的toggleClass方法。。这里做了一个特例区分,如果父类有data-toggle='buttons-radio'属性的,只能有一个按钮有特殊样式,这个逻辑之前我们已经在别的插件中总结了。上述的代码也是用的这个逻辑。

ok,回到我们开始的问题,第一个按钮不能使用,那是我们没有绑定事件,在我们动手做之前,先大致看一下原型上的另一个方法setState

setState: function ( state ) {
var d = 'disabled'
, $el = this.$element
, data = $el.data()
, val = $el.is('input') ? 'val' : 'html'//如果是input,采用val()方取值,不是则使用html()方法
state = state + 'Text'
data.resetText || $el.data('resetText', $el[val]())
//console.log(this.options[state]);
$el[val](data[state] || this.options[state]) // push to event loop to allow forms to submit
setTimeout(function () {
state == 'loadingText' ?
$el.addClass(d).attr(d, d) :
$el.removeClass(d).removeAttr(d);
}, 0)
}

如果我们获取第一个按钮的jQuery对象,调用button方法,必须要传参数,不传的话,不执行。详情可以回看它的button方法的定义。

else if (option) data.setState(option)//需要传值

传什么值,随便传么,试一下不行,重新看setState方法。它将形参与字符串'Text'相加,最后将其作为属性名去查找对象值,再看看$el.data()里的内容(默认参数和HTML结构)

<button id="fat-btn" class="btn btn-primary" data-loading-text="loading..."> 载入状态 </button>

data中有个loadingText属性,注意这里需要用驼峰命名。那我们传入的值就为loading了。实验一下,完全可以。

至于最后在setState方法中加入定时器,本人觉得写的很蛋疼。loading的过程,是等待服务器响应并将处理结果返回给浏览器,一般考虑ajax实现,不过读者可以根据自己的需求,自行修改,没有最好的代码,只有更强的coder。

上面的部分样式,大家可以参考bootstrap.css 去查看,比较简单。

内容不多,时间刚好,以上是我的一点读码体会,如有错误,请指出,大家共通学习。

bootstrap插件学习-bootstrap.button.js的更多相关文章

  1. bootstrap插件学习-bootstrap.dropdown.js

    bootstrap插件学习-bootstrap.dropdown.js 先看bootstrap.dropdown.js的结构 var toggle = '[data-toggle="drop ...

  2. bootstrap插件学习-bootstrap.modal.js

    bootstrap插件学习-bootstrap.modal.js 先从bootstrap.modal.js的结构看起. function($){ var Modal = function(){} // ...

  3. bootstrap插件学习-bootstrap.typehead.js

    先看bootstrap.typehead.js的结构 var Typeahead = function ( element, options ){} //构造器 Typeahead.prototype ...

  4. bootstrap插件学习-bootstrap.carousel.js

    先看bootstrap.carousel.js的结构 var Carousel = function (element, options){} //构造器 Carousel.prototype = { ...

  5. bootstrap插件学习-bootstrap.collapse.js

    先看bootstrap.collapse.js的结构 var Collapse = function ( element, options ){} // 构造器 Collapse.prototype ...

  6. bootstrap插件学习-bootstrap.alert.js

    我们先看bootstrap.alert.js的结构 var dismiss = '[data-dismiss="alert"]' //自定义属性 Alert = function ...

  7. bootstrap插件学习-bootstrap.popover.js

    先看bootstrap.popover.js的结构 var Popover = function ( element, options ){} //构造器 Popover.prototype = {} ...

  8. bootstrap插件学习-bootstrap.tooltip.js

    先看bootstrap-tooltip.js的结构 var Tooltip = function ( element, options ){} // 构造器 Tooltip.prototype ={} ...

  9. bootstrap插件学习-bootstrap.scrollspy.js

    先看bootstrap.dropdown.js的结构 function ScrollSpy(){} //构造函数 ScrollSpy.prototype = {} //构造器的原型 $.fn.scro ...

随机推荐

  1. INSERT INTO .. ON DUPLICATE KEY更新多行记录

    现在问题来了,如果INSERT多行记录, ON DUPLICATE KEY UPDATE后面字段的值怎么指定?要知道一条INSERT语句中只能有一个ON DUPLICATE KEY UPDATE,到底 ...

  2. static成员函数

    1.static成员函数不能定义为const的,这是因为static成员函数只是全局函数的一个形式上的封装,而且static成员函数不能访问类的非静态成员(没有this)指针,修改非静态数据成员又从何 ...

  3. const成员函数

    尽管函数名和参数列表都相同,void foo( ) const成员函数是可以与void foo( )并存的,可以形成重载! 我们假设调用语句为obj.foo(),如果obj为non-const对象,则 ...

  4. 那些在学习iOS开发前就应该知道的事(part 1)

    英文原文:Things I wish I had known before starting iOS development—Part 1 http://www.cocoachina.com/ios/ ...

  5. win7下虚拟机安装mac 转载自 http://itbbs.pconline.com.cn/50602805.html

    最近,不断有人问起,如何在vmware下安装MAC系统.起因是以前曾发过一篇贴,在vmware8下安装MAC的方法.于是,重新下载了最新版苹果系统10.8.5,终于成功安装.现将注意事项及过程与各位朋 ...

  6. 删除windows系统中以前的设备(比如以前的网卡)或驱动的方法

    1.在“开始”菜单单击“运行”,然后在“运行”对话框中输入“CMD”命令打开命令提示符窗口:2.在提示符窗口中输入“Set devmgr_show_nonpresent_devices=1”并回车:3 ...

  7. Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树

    C. Drazil and Park 题目连接: http://codeforces.com/contest/516/problem/C Description Drazil is a monkey. ...

  8. ibatis返回map列表

    ibatis返回map列表 1. resultClass="java.util.HashMap"   <select id="queryCustmerCarNoBy ...

  9. SecureCRT的快捷键

    快捷键,有时比笨拙的方式,要效率高很多,近期经常和Linux打交道,用到SecureCRT,这里就从网上找到部分快捷方式,作为日后查看,以防经常查找. Alt + Enter -- 全屏Alt + B ...

  10. Navi.Soft30.产品.代码生成器.操作手册

    1系统简介 1.1功能简述 在Net软件开发过程中,大部分时间都是在编写代码,并且都是重复和冗杂的代码.比如:要实现在数据库中10个表的增删改查功能,大部分代码都是相同的,只需修改10%的代码量.此时 ...