Skip to content

Commit 3f114b4

Browse files
committed
Fix event propagation from inactive and disabled dropdowns (twbs#30510)
1 parent 1b575c2 commit 3f114b4

File tree

2 files changed

+67
-3
lines changed

2 files changed

+67
-3
lines changed

js/src/dropdown.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -452,9 +452,6 @@ class Dropdown {
452452
return
453453
}
454454

455-
event.preventDefault()
456-
event.stopPropagation()
457-
458455
if (this.disabled || $(this).hasClass(CLASS_NAME_DISABLED)) {
459456
return
460457
}
@@ -466,6 +463,9 @@ class Dropdown {
466463
return
467464
}
468465

466+
event.preventDefault()
467+
event.stopPropagation()
468+
469469
if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
470470
if (event.which === ESCAPE_KEYCODE) {
471471
const toggle = parent.querySelector(SELECTOR_DATA_TOGGLE)

js/tests/unit/dropdown.js

+64
Original file line numberDiff line numberDiff line change
@@ -1020,6 +1020,70 @@ $(function () {
10201020
$textarea.trigger('click')
10211021
})
10221022

1023+
QUnit.test('should not stop key event propagation when dropdown is disabled', function (assert) {
1024+
assert.expect(1)
1025+
var done = assert.async()
1026+
1027+
var dropdownHTML = '<div class="tabs">' +
1028+
'<div class="dropdown">' +
1029+
'<a href="#" class="dropdown-toggle" id="toggle" data-toggle="dropdown" disabled>Dropdown</a>' +
1030+
'<div class="dropdown-menu">' +
1031+
'<a class="dropdown-item" id="item" href="#">Menu item</a>' +
1032+
'</div>' +
1033+
'</div>'
1034+
1035+
var $dropdown = $(dropdownHTML)
1036+
.appendTo('#qunit-fixture')
1037+
.find('[data-toggle="dropdown"]')
1038+
.bootstrapDropdown()
1039+
1040+
var $body = $('body')
1041+
1042+
$(document).on('keydown', function () {
1043+
$body.addClass('event-handled')
1044+
})
1045+
1046+
// Key escape
1047+
$dropdown.trigger('focus').trigger($.Event('keydown', {
1048+
which: 27
1049+
}))
1050+
1051+
assert.ok($body.hasClass('event-handled'), 'ESC key event was propagated')
1052+
done()
1053+
})
1054+
1055+
QUnit.test('should not stop ESC key event propagation when dropdown is not active', function (assert) {
1056+
assert.expect(1)
1057+
var done = assert.async()
1058+
1059+
var dropdownHTML = '<div class="tabs">' +
1060+
'<div class="dropdown">' +
1061+
'<a href="#" class="dropdown-toggle" id="toggle" data-toggle="dropdown">Dropdown</a>' +
1062+
'<div class="dropdown-menu">' +
1063+
'<a class="dropdown-item" id="item" href="#">Menu item</a>' +
1064+
'</div>' +
1065+
'</div>'
1066+
1067+
var $dropdown = $(dropdownHTML)
1068+
.appendTo('#qunit-fixture')
1069+
.find('[data-toggle="dropdown"]')
1070+
.bootstrapDropdown()
1071+
1072+
var $body = $('body')
1073+
1074+
$(document).on('keydown', function () {
1075+
$body.addClass('event-handled')
1076+
})
1077+
1078+
// Key escape
1079+
$dropdown.trigger('focus').trigger($.Event('keydown', {
1080+
which: 27
1081+
}))
1082+
1083+
assert.ok($body.hasClass('event-handled'), 'ESC key event was propagated')
1084+
done()
1085+
})
1086+
10231087
QUnit.test('should not use Popper.js if display set to static', function (assert) {
10241088
assert.expect(1)
10251089
var dropdownHTML =

0 commit comments

Comments
 (0)