diff --git a/js/src/button.js b/js/src/button.js index 2aed6b09c718..4365a65ea05e 100644 --- a/js/src/button.js +++ b/js/src/button.js @@ -56,7 +56,7 @@ class Button { // Public - toggle() { + toggle(avoidTriggerChange) { let triggerChangeEvent = true let addAriaPressed = true const rootElement = $(this._element).closest( @@ -86,7 +86,9 @@ class Button { input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE) } - $(input).trigger('change') + if (!avoidTriggerChange) { + $(input).trigger('change') + } } input.focus() @@ -113,7 +115,7 @@ class Button { // Static - static _jQueryInterface(config) { + static _jQueryInterface(config, avoidTriggerChange) { return this.each(function () { let data = $(this).data(DATA_KEY) @@ -123,7 +125,7 @@ class Button { } if (config === 'toggle') { - data[config]() + data[config](avoidTriggerChange) } }) } @@ -154,8 +156,8 @@ $(document) return } - if (initialButton.tagName !== 'LABEL' || inputBtn && inputBtn.type !== 'checkbox') { - Button._jQueryInterface.call($(button), 'toggle') + if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') { + Button._jQueryInterface.call($(button), 'toggle', initialButton.tagName === 'INPUT') } } }) diff --git a/js/tests/unit/button.js b/js/tests/unit/button.js index 2adffedd9fe6..1bd62b6b8b60 100644 --- a/js/tests/unit/button.js +++ b/js/tests/unit/button.js @@ -180,6 +180,32 @@ $(function () { $group.find('label').trigger('click') }) + QUnit.test('should trigger label change event only once', function (assert) { + assert.expect(1) + var done = assert.async() + var countChangeEvent = 0 + + var groupHTML = '
' + + '' + + '
' + var $group = $(groupHTML).appendTo('#qunit-fixture') + + var $btn = $group.children().eq(0) + + $group.find('label').on('change', function () { + countChangeEvent++ + }) + + setTimeout(function () { + assert.ok(countChangeEvent === 1, 'onchange event fired only once') + done() + }, 5) + + $btn[0].click() + }) + QUnit.test('should check for closest matching toggle', function (assert) { assert.expect(18) var groupHTML = '
' +