Skip to content

Commit 133137b

Browse files
committed
Menubar: Focus/tab handling, improved much
1 parent d4a81ec commit 133137b

File tree

1 file changed

+45
-12
lines changed

1 file changed

+45
-12
lines changed

tests/visual/menu/menubar.js

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ $.widget("ui.menubar", {
1414
_create: function() {
1515
var self = this;
1616
var items = this.items = this.element.children("button, a");
17+
items.slice(1).attr("tabIndex", -1);
1718
var o = this.options;
1819

1920
this.element.addClass('ui-menubar ui-widget-header ui-helper-clearfix');
@@ -32,19 +33,16 @@ $.widget("ui.menubar", {
3233
event.stopPropagation();
3334
switch (event.keyCode) {
3435
case $.ui.keyCode.LEFT:
35-
self.left(event);
36+
self._left(event);
3637
event.preventDefault();
3738
break;
3839
case $.ui.keyCode.RIGHT:
39-
self.right(event);
40+
self._right(event);
4041
event.preventDefault();
4142
break;
4243
};
4344
}).blur(function() {
44-
$(this).hide().prev().removeClass("ui-state-active").removeAttr("tabIndex");
45-
self.timer = setTimeout(function() {
46-
self.open = false;
47-
}, 13);
45+
self._close();
4846
});
4947
});
5048
items.each(function() {
@@ -64,11 +62,20 @@ $.widget("ui.menubar", {
6462
})
6563
.bind( "keydown", function( event ) {
6664
switch ( event.keyCode ) {
65+
case $.ui.keyCode.SPACE:
6766
case $.ui.keyCode.UP:
6867
case $.ui.keyCode.DOWN:
6968
self._open( event, $( this ).next() );
7069
event.preventDefault();
7170
break;
71+
case $.ui.keyCode.LEFT:
72+
self._prev( event, $( this ) );
73+
event.preventDefault();
74+
break;
75+
case $.ui.keyCode.RIGHT:
76+
self._next( event, $( this ) );
77+
event.preventDefault();
78+
break;
7279
}
7380
})
7481
.addClass("ui-button ui-widget ui-button-text-only ui-menubar-link")
@@ -86,7 +93,7 @@ $.widget("ui.menubar", {
8693
});
8794
self._bind(document, {
8895
click: function(event) {
89-
!$(event.target).closest(".ui-menubar").length && self._close();
96+
self.open && !$(event.target).closest(".ui-menubar").length && self._close();
9097
}
9198
})
9299
self._bind({
@@ -103,12 +110,18 @@ $.widget("ui.menubar", {
103110
},
104111

105112
_close: function() {
106-
this.items.next("ul").hide();
107-
this.items.removeClass("ui-state-active").removeAttr("tabIndex");
108-
this.open = false;
113+
this.active.menu("closeAll").hide();
114+
this.active.prev().removeClass("ui-state-active").removeAttr("tabIndex");
115+
this.active = null;
116+
var self = this;
117+
// delay for the next focus event to see it as still "open"
118+
self.timer = setTimeout(function() {
119+
self.open = false;
120+
}, 13);
109121
},
110122

111123
_open: function(event, menu) {
124+
// TODO refactor with _close
112125
if (this.active) {
113126
this.active.menu("closeAll").hide();
114127
this.active.prev().removeClass("ui-state-active").removeAttr("tabIndex");
@@ -124,7 +137,27 @@ $.widget("ui.menubar", {
124137
}).focus();
125138
},
126139

127-
left: function(event) {
140+
_prev: function( event, button ) {
141+
button.attr("tabIndex", -1);
142+
var prev = button.prevAll( ".ui-button" ).eq( 0 );
143+
if (prev.length) {
144+
prev.removeAttr("tabIndex")[0].focus();
145+
} else {
146+
this.element.children(".ui-button:last").removeAttr("tabIndex")[0].focus();
147+
}
148+
},
149+
150+
_next: function( event, button ) {
151+
button.attr("tabIndex", -1);
152+
var next = button.nextAll( ".ui-button" ).eq( 0 );
153+
if (next.length) {
154+
next.removeAttr("tabIndex")[0].focus();
155+
} else {
156+
this.element.children(".ui-button:first").removeAttr("tabIndex")[0].focus();
157+
}
158+
},
159+
160+
_left: function(event) {
128161
var prev = this.active.prevAll( ".ui-menu" ).eq( 0 );
129162
if (prev.length) {
130163
this._open(event, prev);
@@ -133,7 +166,7 @@ $.widget("ui.menubar", {
133166
}
134167
},
135168

136-
right: function(event) {
169+
_right: function(event) {
137170
var next = this.active.nextAll( ".ui-menu" ).eq( 0 );
138171
if (next.length) {
139172
this._open(event, next);

0 commit comments

Comments
 (0)