@@ -13,20 +13,28 @@ $.widget("ui.menubar", {
13
13
} ,
14
14
_create : function ( ) {
15
15
var self = this ;
16
- var items = this . items = this . element . children ( "button, a" ) ;
16
+ var items = this . items = this . element . children ( "li" )
17
+ . addClass ( "ui-menubar-item" )
18
+ . attr ( "role" , "presentation" )
19
+ . children ( "button, a" ) ;
17
20
items . slice ( 1 ) . attr ( "tabIndex" , - 1 ) ;
18
21
var o = this . options ;
19
22
20
- this . element . addClass ( 'ui-menubar ui-widget-header ui-helper-clearfix' ) ;
23
+ this . element . addClass ( 'ui-menubar ui-widget-header ui-helper-clearfix' ) . attr ( "role" , "menubar" ) ;
21
24
this . _focusable ( items ) ;
22
25
this . _hoverable ( items ) ;
23
26
items . next ( "ul" ) . each ( function ( i , elm ) {
24
27
$ ( elm ) . menu ( {
25
28
select : function ( event , ui ) {
26
- ui . item . parents ( "ul:last" ) . hide ( )
27
- self . options . select . apply ( this , arguments ) ;
29
+ ui . item . parents ( "ul.ui-menu:last" ) . hide ( ) ;
30
+ self . _trigger ( "select" , event , ui ) ;
31
+ self . _close ( ) ;
32
+ $ ( event . target ) . prev ( ) . focus ( ) ;
28
33
}
29
- } ) . hide ( ) . keydown ( function ( event ) {
34
+ } ) . hide ( )
35
+ . attr ( "aria-hidden" , "true" )
36
+ . attr ( "aria-expanded" , "false" )
37
+ . keydown ( function ( event ) {
30
38
var menu = $ ( this ) ;
31
39
if ( menu . is ( ":hidden" ) )
32
40
return ;
@@ -40,9 +48,13 @@ $.widget("ui.menubar", {
40
48
self . _right ( event ) ;
41
49
event . preventDefault ( ) ;
42
50
break ;
51
+ case $ . ui . keyCode . TAB :
52
+ self . open = false ;
53
+ break ;
43
54
} ;
44
55
} ) . blur ( function ( event ) {
45
- self . _close ( event ) ;
56
+ if ( ! self . open )
57
+ self . _close ( event ) ;
46
58
} ) ;
47
59
} ) ;
48
60
items . each ( function ( ) {
@@ -60,7 +72,7 @@ $.widget("ui.menubar", {
60
72
self . _close ( ) ;
61
73
return ;
62
74
}
63
- if ( self . open || event . type == "click" ) {
75
+ if ( ( self . open && event . type == "mouseenter" ) || event . type == "click" ) {
64
76
self . _open ( event , menu ) ;
65
77
}
66
78
} )
@@ -83,6 +95,8 @@ $.widget("ui.menubar", {
83
95
}
84
96
} )
85
97
. addClass ( "ui-button ui-widget ui-button-text-only ui-menubar-link" )
98
+ . attr ( "role" , "menuitem" )
99
+ . attr ( "aria-haspopup" , "true" )
86
100
. wrapInner ( "<span class='ui-button-text'></span>" ) ;
87
101
88
102
if ( o . menuIcon ) {
@@ -108,15 +122,45 @@ $.widget("ui.menubar", {
108
122
if ( self . active . menu ( "left" , event ) !== true ) {
109
123
var active = self . active ;
110
124
self . active . blur ( ) ;
125
+ self . _close ( event ) ;
111
126
active . prev ( ) . focus ( ) ;
112
127
}
113
128
}
114
129
}
115
130
} ) ;
116
131
} ,
132
+ _destroy : function ( ) {
133
+ var items = this . element . children ( "li" )
134
+ . removeClass ( "ui-menubar-item" )
135
+ . removeAttr ( "role" , "presentation" )
136
+ . children ( "button, a" ) ;
137
+
138
+ this . element . removeClass ( 'ui-menubar ui-widget-header ui-helper-clearfix' ) . removeAttr ( "role" , "menubar" ) . unbind ( ".menubar" ) ; ;
139
+ items . unbind ( "focusin focusout click focus mouseenter keydown" ) ;
140
+
141
+ items
142
+ . removeClass ( "ui-button ui-widget ui-button-text-only ui-menubar-link" )
143
+ . removeAttr ( "role" , "menuitem" )
144
+ . removeAttr ( "aria-haspopup" , "true" )
145
+ . children ( "span.ui-button-text" ) . each ( function ( i , e ) {
146
+ var item = $ ( this ) ;
147
+ item . parent ( ) . html ( item . html ( ) ) ;
148
+ } ) ;
149
+ $ ( document ) . unbind ( ".menubar" ) ;
150
+
151
+ //TODO remove icons
152
+
153
+ this . element . find ( ":ui-menu" ) . menu ( "destroy" )
154
+ . show ( )
155
+ . removeAttr ( "aria-hidden" , "true" )
156
+ . removeAttr ( "aria-expanded" , "false" )
157
+ . removeAttr ( "tabindex" )
158
+ . unbind ( "keydown" , "blur" )
159
+ ;
160
+ } ,
117
161
118
162
_close : function ( ) {
119
- this . active . menu ( "closeAll" ) . hide ( ) ;
163
+ this . active . menu ( "closeAll" ) . hide ( ) . attr ( "aria-hidden" , "true" ) . attr ( "aria-expanded" , "false" ) ;
120
164
this . active . prev ( ) . removeClass ( "ui-state-active" ) . removeAttr ( "tabIndex" ) ;
121
165
this . active = null ;
122
166
var self = this ;
@@ -133,7 +177,7 @@ $.widget("ui.menubar", {
133
177
}
134
178
// almost the same as _close above, but don't remove tabIndex
135
179
if ( this . active ) {
136
- this . active . menu ( "closeAll" ) . hide ( ) ;
180
+ this . active . menu ( "closeAll" ) . hide ( ) . attr ( "aria-hidden" , "true" ) . attr ( "aria-expanded" , "false" ) ;
137
181
this . active . prev ( ) . removeClass ( "ui-state-active" ) ;
138
182
}
139
183
clearTimeout ( this . timer ) ;
@@ -144,44 +188,52 @@ $.widget("ui.menubar", {
144
188
my : "left top" ,
145
189
at : "left bottom" ,
146
190
of : button
147
- } ) . focus ( ) ;
191
+ } )
192
+ . removeAttr ( "aria-hidden" ) . attr ( "aria-expanded" , "true" )
193
+ . menu ( "focus" , event , menu . children ( "li" ) . first ( ) )
194
+ . focus ( ) ;
195
+
148
196
} ,
149
197
150
198
_prev : function ( event , button ) {
151
199
button . attr ( "tabIndex" , - 1 ) ;
152
- var prev = button . prevAll ( ".ui-button" ) . eq ( 0 ) ;
200
+ var prev = button . parent ( ) . prevAll ( "li" ) . children ( ".ui-button" ) . eq ( 0 ) ;
153
201
if ( prev . length ) {
154
202
prev . removeAttr ( "tabIndex" ) [ 0 ] . focus ( ) ;
155
203
} else {
156
- this . element . children ( ".ui-button:last" ) . removeAttr ( "tabIndex" ) [ 0 ] . focus ( ) ;
204
+ var lastItem = this . element . children ( "li:last" ) . children ( ".ui-button:last" ) ;
205
+ lastItem . removeAttr ( "tabIndex" ) [ 0 ] . focus ( ) ;
157
206
}
158
207
} ,
159
208
160
209
_next : function ( event , button ) {
161
210
button . attr ( "tabIndex" , - 1 ) ;
162
- var next = button . nextAll ( ".ui-button" ) . eq ( 0 ) ;
211
+ var next = button . parent ( ) . nextAll ( "li" ) . children ( ".ui-button" ) . eq ( 0 ) ;
163
212
if ( next . length ) {
164
213
next . removeAttr ( "tabIndex" ) [ 0 ] . focus ( ) ;
165
214
} else {
166
- this . element . children ( ".ui-button:first" ) . removeAttr ( "tabIndex" ) [ 0 ] . focus ( ) ;
215
+ var firstItem = this . element . children ( "li:first" ) . children ( ".ui-button:first" ) ;
216
+ firstItem . removeAttr ( "tabIndex" ) [ 0 ] . focus ( ) ;
167
217
}
168
218
} ,
169
219
170
220
_left : function ( event ) {
171
- var prev = this . active . prevAll ( ".ui-menu" ) . eq ( 0 ) ;
221
+ var prev = this . active . parent ( ) . prevAll ( "li:eq(0)" ) . children ( ".ui-menu" ) . eq ( 0 ) ;
172
222
if ( prev . length ) {
173
223
this . _open ( event , prev ) ;
174
224
} else {
175
- this . _open ( event , this . element . children ( ".ui-menu:last" ) ) ;
225
+ var lastItem = this . element . children ( "li:last" ) . children ( ".ui-menu:first" ) ;
226
+ this . _open ( event , lastItem ) ;
176
227
}
177
228
} ,
178
229
179
230
_right : function ( event ) {
180
- var next = this . active . nextAll ( ".ui-menu" ) . eq ( 0 ) ;
231
+ var next = this . active . parent ( ) . nextAll ( "li:eq(0)" ) . children ( ".ui-menu" ) . eq ( 0 ) ;
181
232
if ( next . length ) {
182
233
this . _open ( event , next ) ;
183
234
} else {
184
- this . _open ( event , this . element . children ( ".ui-menu:first" ) ) ;
235
+ var firstItem = this . element . children ( "li:first" ) . children ( ".ui-menu:first" ) ;
236
+ this . _open ( event , firstItem ) ;
185
237
}
186
238
}
187
239
} ) ;
0 commit comments