Skip to content

Commit efbf1f1

Browse files
committed
fix(dropdown): handle keyboard-nav correctly
- properly handle arrow key navigation in dropdown button menus fixes angular-ui#4091
1 parent 707fbf5 commit efbf1f1

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

src/dropdown/dropdown.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
278278
e.preventDefault();
279279
e.stopPropagation();
280280

281-
var elems = angular.element(element).find('a');
281+
var elems = dropdownCtrl.dropdownMenu.find('a');
282282

283283
switch (e.keyCode) {
284284
case (40): { // Down
@@ -299,7 +299,6 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
299299
}
300300
});
301301
}
302-
303302
};
304303
})
305304

src/dropdown/test/dropdown.spec.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ describe('dropdownToggle', function() {
2323
elm.find('a[dropdown-toggle]').click();
2424
};
2525

26+
var clickDropdownButtonToggle = function(elm) {
27+
elm = elm || element;
28+
elm.find('button[dropdown-toggle]').click();
29+
};
30+
2631
var triggerKeyDown = function (element, keyCode) {
2732
var e = $.Event('keydown');
2833
e.which = keyCode;
@@ -673,4 +678,40 @@ describe('dropdownToggle', function() {
673678
expect(isFocused(focusEl)).toBe(true);
674679
});
675680
});
681+
682+
describe('button dropdown menu with `keyboard-nav` option with `dropdown-append-to-body` option - #4091', function() {
683+
function dropdown() {
684+
return $compile('<div dropdown keyboard-nav dropdown-append-to-body><button dropdown-toggle>Dropdown on Body</button><ul class="dropdown-menu"><li><a>Hello on Body</a></li><li><a>Hello Again</a></li></ul></div>')($rootScope);
685+
}
686+
687+
beforeEach(function() {
688+
element = dropdown();
689+
});
690+
691+
it('should focus first list element when down arrow pressed', function() {
692+
clickDropdownButtonToggle();
693+
694+
triggerKeyDown($document, 40);
695+
696+
expect(element.hasClass(dropdownConfig.openClass)).toBe(true);
697+
expect(element.controller('dropdown').selectedOption).toBe(0); // document.activeElement won't be <li>
698+
});
699+
700+
it('should not focus first list element when down arrow pressed if closed', function() {
701+
triggerKeyDown($document, 40);
702+
703+
expect(element.hasClass(dropdownConfig.openClass)).toBe(false);
704+
var focusEl = $document.find('ul').eq(0).find('a');
705+
expect(isFocused(focusEl)).toBe(false);
706+
});
707+
708+
it('should focus second list element when down arrow pressed twice', function() {
709+
clickDropdownButtonToggle();
710+
triggerKeyDown($document, 40);
711+
triggerKeyDown($document, 40);
712+
713+
expect(element.hasClass(dropdownConfig.openClass)).toBe(true);
714+
expect(element.controller('dropdown').selectedOption).toBe(1); // document.activeElement won't be <li>
715+
});
716+
});
676717
});

0 commit comments

Comments
 (0)