diff options
| author | fat <[email protected]> | 2015-01-03 13:58:44 -0800 |
|---|---|---|
| committer | fat <[email protected]> | 2015-02-11 11:29:43 -0800 |
| commit | 834220ea20ce5b7cd31edfb624a28b4bf8b29a6a (patch) | |
| tree | 19bfdadb0c140df437e7b7034e5e1f5ce58343cc /js/button.js | |
| parent | aed1cd31218113d67d2eca3296edf5d1700b19b8 (diff) | |
| download | bootstrap-834220ea20ce5b7cd31edfb624a28b4bf8b29a6a.tar.xz bootstrap-834220ea20ce5b7cd31edfb624a28b4bf8b29a6a.zip | |
bootstrap onto closure
Diffstat (limited to 'js/button.js')
| -rw-r--r-- | js/button.js | 275 |
1 files changed, 183 insertions, 92 deletions
diff --git a/js/button.js b/js/button.js index 4d5690173..8ee2d6b08 100644 --- a/js/button.js +++ b/js/button.js @@ -1,116 +1,207 @@ -/* ======================================================================== - * Bootstrap: button.js v3.3.2 +/** ======================================================================= + * Bootstrap: button.js v4.0.0 * http://getbootstrap.com/javascript/#buttons * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - this.isLoading = false - } - - Button.VERSION = '3.3.2' - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state = state + 'Text' - - if (data.resetText == null) $el.data('resetText', $el[val]()) - - // push to event loop to allow forms to submit - setTimeout($.proxy(function () { - $el[val](data[state] == null ? this.options[state] : data[state]) + * ======================================================================== + * @fileoverview - Bootstrap's generic button component. + * + * Note (@fat): Deprecated "setState" – imo, better solutions for managing a + * buttons state should exist outside this plugin. + * + * Public Methods & Properties: + * + * + $.button + * + $.button.noConflict + * + $.button.Constructor + * + $.button.Constructor.VERSION + * + $.button.Constructor.prototype.toggle + * + * ======================================================================== + */ + +'use strict'; + + +/** + * Our Button class. + * @param {Element!} element + * @constructor + */ +var Button = function (element) { + + /** @private {Element} */ + this._element = element + +} + + +/** + * @const + * @type {string} + */ +Button['VERSION'] = '4.0.0' + + +/** + * @const + * @type {string} + * @private + */ +Button._NAME = 'button' + + +/** + * @const + * @type {string} + * @private + */ +Button._DATA_KEY = 'bs.button' + + +/** + * @const + * @type {Function} + * @private + */ +Button._JQUERY_NO_CONFLICT = $.fn[Button._NAME] + + +/** + * @const + * @enum {string} + * @private + */ +Button._ClassName = { + ACTIVE : 'active', + BUTTON : 'btn', + FOCUS : 'focus' +} + + +/** + * @const + * @enum {string} + * @private + */ +Button._Selector = { + DATA_TOGGLE_CARROT : '[data-toggle^="button"]', + DATA_TOGGLE : '[data-toggle="buttons"]', + INPUT : 'input', + ACTIVE : '.active', + BUTTON : '.btn' +} + + +/** + * Provides the jQuery Interface for the Button component. + * @param {string=} opt_config + * @this {jQuery} + * @return {jQuery} + * @private + */ +Button._jQueryInterface = function (opt_config) { + return this.each(function () { + var data = $(this).data(Button._DATA_KEY) + + if (!data) { + data = new Button(this) + $(this).data(Button._DATA_KEY, data) + } - if (state == 'loadingText') { - this.isLoading = true - $el.addClass(d).attr(d, d) - } else if (this.isLoading) { - this.isLoading = false - $el.removeClass(d).removeAttr(d) + if (opt_config === 'toggle') { + data[opt_config]() + } + }) +} + + +/** + * Toggle's the button active state + */ +Button.prototype['toggle'] = function () { + var triggerChangeEvent = true + var rootElement = $(this._element).closest(Button._Selector.DATA_TOGGLE)[0] + + if (rootElement) { + var input = $(this._element).find(Button._Selector.INPUT)[0] + if (input) { + if (input.type == 'radio') { + if (input.checked && $(this._element).hasClass(Button._ClassName.ACTIVE)) { + triggerChangeEvent = false + } else { + var activeElement = $(rootElement).find(Button._Selector.ACTIVE)[0] + if (activeElement) { + $(activeElement).removeClass(Button._ClassName.ACTIVE) + } + } } - }, this), 0) - } - - Button.prototype.toggle = function () { - var changed = true - var $parent = this.$element.closest('[data-toggle="buttons"]') - if ($parent.length) { - var $input = this.$element.find('input') - if ($input.prop('type') == 'radio') { - if ($input.prop('checked') && this.$element.hasClass('active')) changed = false - else $parent.find('.active').removeClass('active') + if (triggerChangeEvent) { + input.checked = !$(this._element).hasClass(Button._ClassName.ACTIVE) + $(this._element).trigger('change') } - if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') - } else { - this.$element.attr('aria-pressed', !this.$element.hasClass('active')) } + } else { + this._element.setAttribute('aria-pressed', !$(this._element).hasClass(Button._ClassName.ACTIVE)) + } - if (changed) this.$element.toggleClass('active') + if (triggerChangeEvent) { + $(this._element).toggleClass(Button._ClassName.ACTIVE) } +} - // BUTTON PLUGIN DEFINITION - // ======================== +/** + * ------------------------------------------------------------------------ + * jQuery Interface + noConflict implementaiton + * ------------------------------------------------------------------------ + */ - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option +/** + * @const + * @type {Function} + */ +$.fn[Button._NAME] = Button._jQueryInterface - if (!data) $this.data('bs.button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } +/** + * @const + * @type {Function} + */ +$.fn[Button._NAME]['Constructor'] = Button - var old = $.fn.button - $.fn.button = Plugin - $.fn.button.Constructor = Button +/** + * @const + * @type {Function} + */ +$.fn[Button._NAME]['noConflict'] = function () { + $.fn[Button._NAME] = Button._JQUERY_NO_CONFLICT + return this +} - // BUTTON NO CONFLICT - // ================== +/** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } +$(document) + .on('click.bs.button.data-api', Button._Selector.DATA_TOGGLE_CARROT, function (event) { + event.preventDefault() + var button = event.target - // BUTTON DATA-API - // =============== - - $(document) - .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - Plugin.call($btn, 'toggle') - e.preventDefault() - }) - .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { - $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) - }) + if (!$(button).hasClass(Button._ClassName.BUTTON)) { + button = $(button).closest(Button._Selector.BUTTON) + } -}(jQuery); + Button._jQueryInterface.call($(button), 'toggle') + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', Button._Selector.DATA_TOGGLE_CARROT, function (event) { + var button = $(event.target).closest(Button._Selector.BUTTON)[0] + $(button).toggleClass(Button._ClassName.FOCUS, /^focus(in)?$/.test(event.type)) + }) |
