4 * --------------------------------------------------------------------------
5 * Bootstrap (v4.1.3): button.js
6 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7 * --------------------------------------------------------------------------
10 const Button = (($) => {
12 * ------------------------------------------------------------------------
14 * ------------------------------------------------------------------------
18 const VERSION = '4.1.3'
19 const DATA_KEY = 'bs.button'
20 const EVENT_KEY = `.${DATA_KEY}`
21 const DATA_API_KEY = '.data-api'
22 const JQUERY_NO_CONFLICT = $.fn[NAME]
31 DATA_TOGGLE_CARROT : '[data-toggle^="button"]',
32 DATA_TOGGLE : '[data-toggle="buttons"]',
39 CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,
40 FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} ` +
41 `blur${EVENT_KEY}${DATA_API_KEY}`
45 * ------------------------------------------------------------------------
47 * ------------------------------------------------------------------------
51 constructor(element) {
52 this._element = element
57 static get VERSION() {
64 let triggerChangeEvent = true
65 let addAriaPressed = true
66 const rootElement = $(this._element).closest(
71 const input = this._element.querySelector(Selector.INPUT)
74 if (input.type === 'radio') {
76 this._element.classList.contains(ClassName.ACTIVE)) {
77 triggerChangeEvent = false
79 const activeElement = rootElement.querySelector(Selector.ACTIVE)
82 $(activeElement).removeClass(ClassName.ACTIVE)
87 if (triggerChangeEvent) {
88 if (input.hasAttribute('disabled') ||
89 rootElement.hasAttribute('disabled') ||
90 input.classList.contains('disabled') ||
91 rootElement.classList.contains('disabled')) {
94 input.checked = !this._element.classList.contains(ClassName.ACTIVE)
95 $(input).trigger('change')
99 addAriaPressed = false
103 if (addAriaPressed) {
104 this._element.setAttribute('aria-pressed',
105 !this._element.classList.contains(ClassName.ACTIVE))
108 if (triggerChangeEvent) {
109 $(this._element).toggleClass(ClassName.ACTIVE)
114 $.removeData(this._element, DATA_KEY)
120 static _jQueryInterface(config) {
121 return this.each(function () {
122 let data = $(this).data(DATA_KEY)
125 data = new Button(this)
126 $(this).data(DATA_KEY, data)
129 if (config === 'toggle') {
137 * ------------------------------------------------------------------------
138 * Data Api implementation
139 * ------------------------------------------------------------------------
143 .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {
144 event.preventDefault()
146 let button = event.target
148 if (!$(button).hasClass(ClassName.BUTTON)) {
149 button = $(button).closest(Selector.BUTTON)
152 Button._jQueryInterface.call($(button), 'toggle')
154 .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {
155 const button = $(event.target).closest(Selector.BUTTON)[0]
156 $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))
160 * ------------------------------------------------------------------------
162 * ------------------------------------------------------------------------
165 $.fn[NAME] = Button._jQueryInterface
166 $.fn[NAME].Constructor = Button
167 $.fn[NAME].noConflict = function () {
168 $.fn[NAME] = JQUERY_NO_CONFLICT
169 return Button._jQueryInterface
175 export default Button