@@ -36,11 +36,9 @@ $.widget( "ui.menu", {
36
36
_create : function ( ) {
37
37
this . activeMenu = this . element ;
38
38
this . menuId = this . element . attr ( "id" ) || "ui-menu-" + idIncrement ++ ;
39
- if ( this . element . find ( ".ui-icon" ) . length ) {
40
- this . element . addClass ( "ui-menu-icons" ) ;
41
- }
42
39
this . element
43
40
. addClass ( "ui-menu ui-widget ui-widget-content ui-corner-all" )
41
+ . toggleClass ( "ui-menu-icons" , ! ! this . element . find ( ".ui-icon" ) . length )
44
42
. attr ( {
45
43
id : this . menuId ,
46
44
role : this . options . role ,
@@ -95,9 +93,9 @@ $.widget( "ui.menu", {
95
93
target . siblings ( ) . children ( ".ui-state-active" ) . removeClass ( "ui-state-active" ) ;
96
94
this . focus ( event , target ) ;
97
95
} ,
98
- " mouseleave" : "collapseAll" ,
96
+ mouseleave : "collapseAll" ,
99
97
"mouseleave .ui-menu" : "collapseAll" ,
100
- " focus" : function ( event ) {
98
+ focus : function ( event ) {
101
99
var menu = this . element ,
102
100
firstItem = menu . children ( ".ui-menu-item" ) . eq ( 0 ) ;
103
101
if ( this . _hasScroll ( ) && ! this . active ) {
@@ -120,11 +118,13 @@ $.widget( "ui.menu", {
120
118
}
121
119
} ) ;
122
120
} ,
123
- " keydown" : "_keydown"
121
+ keydown : "_keydown"
124
122
} ) ;
125
123
126
124
this . refresh ( ) ;
127
125
126
+ // TODO: We probably shouldn't bind to document for each menu.
127
+ // TODO: This isn't being cleaned up on destroy.
128
128
this . _bind ( this . document , {
129
129
click : function ( event ) {
130
130
if ( ! $ ( event . target ) . closest ( ".ui-menu" ) . length ) {
@@ -149,7 +149,6 @@ $.widget( "ui.menu", {
149
149
150
150
// destroy menu items
151
151
this . element . find ( ".ui-menu-item" )
152
- . unbind ( ".menu" )
153
152
. removeClass ( "ui-menu-item" )
154
153
. removeAttr ( "role" )
155
154
. children ( "a" )
@@ -158,6 +157,7 @@ $.widget( "ui.menu", {
158
157
. removeAttr ( "role" )
159
158
. removeAttr ( "aria-haspopup" )
160
159
. removeAttr ( "id" )
160
+ // TODO: is this correct? Don't these exist in the original markup?
161
161
. children ( ".ui-icon" )
162
162
. remove ( ) ;
163
163
@@ -166,82 +166,80 @@ $.widget( "ui.menu", {
166
166
} ,
167
167
168
168
_keydown : function ( event ) {
169
+ var match , prev , character , skip ,
170
+ preventDefault = true ;
171
+
172
+ function escape ( value ) {
173
+ return value . replace ( / [ \- \[ \] { } ( ) * + ? . , \\ \^ $ | # \s ] / g, "\\$&" ) ;
174
+ }
175
+
169
176
switch ( event . keyCode ) {
170
177
case $ . ui . keyCode . PAGE_UP :
171
178
this . previousPage ( event ) ;
172
- event . preventDefault ( ) ;
173
179
break ;
174
180
case $ . ui . keyCode . PAGE_DOWN :
175
181
this . nextPage ( event ) ;
176
- event . preventDefault ( ) ;
177
182
break ;
178
183
case $ . ui . keyCode . HOME :
179
184
this . _move ( "first" , "first" , event ) ;
180
- event . preventDefault ( ) ;
181
185
break ;
182
186
case $ . ui . keyCode . END :
183
187
this . _move ( "last" , "last" , event ) ;
184
- event . preventDefault ( ) ;
185
188
break ;
186
189
case $ . ui . keyCode . UP :
187
190
this . previous ( event ) ;
188
- event . preventDefault ( ) ;
189
191
break ;
190
192
case $ . ui . keyCode . DOWN :
191
193
this . next ( event ) ;
192
- event . preventDefault ( ) ;
193
194
break ;
194
195
case $ . ui . keyCode . LEFT :
195
196
this . collapse ( event ) ;
196
- event . preventDefault ( ) ;
197
197
break ;
198
198
case $ . ui . keyCode . RIGHT :
199
199
if ( ! this . active . is ( ".ui-state-disabled" ) ) {
200
200
this . expand ( event ) ;
201
201
}
202
- event . preventDefault ( ) ;
203
202
break ;
204
203
case $ . ui . keyCode . ENTER :
205
204
this . _activate ( event ) ;
206
- event . preventDefault ( ) ;
207
205
break ;
208
206
case $ . ui . keyCode . SPACE :
209
207
this . _activate ( event ) ;
210
- event . preventDefault ( ) ;
211
208
break ;
212
209
case $ . ui . keyCode . ESCAPE :
213
210
this . collapse ( event ) ;
214
- event . preventDefault ( ) ;
215
211
break ;
216
212
default :
213
+ preventDefault = false ;
214
+ prev = this . previousFilter || "" ;
215
+ character = String . fromCharCode ( event . keyCode ) ;
216
+ skip = false ;
217
+
217
218
clearTimeout ( this . filterTimer ) ;
218
- var match ,
219
- prev = this . previousFilter || "" ,
220
- character = String . fromCharCode ( event . keyCode ) ,
221
- skip = false ;
222
219
223
220
if ( character === prev ) {
224
221
skip = true ;
225
222
} else {
226
223
character = prev + character ;
227
224
}
228
- function escape ( value ) {
229
- return value . replace ( / [ \- \[ \] { } ( ) * + ? . , \\ \^ $ | # \s ] / g, "\\$&" ) ;
230
- }
225
+
231
226
match = this . activeMenu . children ( ".ui-menu-item" ) . filter ( function ( ) {
232
227
return new RegExp ( "^" + escape ( character ) , "i" )
233
228
. test ( $ ( this ) . children ( "a" ) . text ( ) ) ;
234
229
} ) ;
235
- match = skip && match . index ( this . active . next ( ) ) !== - 1 ?
236
- this . active . nextAll ( ".ui-menu-item" ) :
230
+ match = skip && match . index ( this . active . next ( ) ) !== - 1 ?
231
+ this . active . nextAll ( ".ui-menu-item" ) :
237
232
match ;
233
+
234
+ // TODO: document what's going on here, character is reset to the original value
238
235
if ( ! match . length ) {
239
- character = String . fromCharCode ( event . keyCode ) ;
240
- match = this . activeMenu . children ( ".ui-menu-item" ) . filter ( function ( ) {
236
+ character = String . fromCharCode ( event . keyCode ) ;
237
+ match = this . activeMenu . children ( ".ui-menu-item" ) . filter ( function ( ) {
241
238
return new RegExp ( "^" + escape ( character ) , "i" )
242
239
. test ( $ ( this ) . children ( "a" ) . text ( ) ) ;
243
240
} ) ;
244
241
}
242
+
245
243
if ( match . length ) {
246
244
this . focus ( event , match ) ;
247
245
if ( match . length > 1 ) {
@@ -256,6 +254,10 @@ $.widget( "ui.menu", {
256
254
delete this . previousFilter ;
257
255
}
258
256
}
257
+
258
+ if ( preventDefault ) {
259
+ event . preventDefault ( ) ;
260
+ }
259
261
} ,
260
262
261
263
_activate : function ( event ) {
@@ -289,10 +291,12 @@ $.widget( "ui.menu", {
289
291
. attr ( "role" , "presentation" )
290
292
. children ( "a" )
291
293
. addClass ( "ui-corner-all" )
292
- . attr ( "tabIndex" , - 1 )
293
- . attr ( "role" , this . _itemRole ( ) )
294
- . attr ( "id" , function ( i ) {
295
- return menuId + "-" + i ;
294
+ . attr ( {
295
+ tabIndex : - 1 ,
296
+ role : this . _itemRole ( ) ,
297
+ id : function ( i ) {
298
+ return menuId + "-" + i ;
299
+ }
296
300
} ) ;
297
301
298
302
// initialize unlinked menu-items as dividers
@@ -305,7 +309,8 @@ $.widget( "ui.menu", {
305
309
var menu = $ ( this ) ,
306
310
item = menu . prev ( "a" ) ;
307
311
308
- item . attr ( "aria-haspopup" , "true" )
312
+ item
313
+ . attr ( "aria-haspopup" , "true" )
309
314
. prepend ( '<span class="ui-menu-icon ui-icon ui-icon-carat-1-e"></span>' ) ;
310
315
menu . attr ( "aria-labelledby" , item . attr ( "id" ) ) ;
311
316
} ) ;
@@ -333,7 +338,11 @@ $.widget( "ui.menu", {
333
338
}
334
339
335
340
// highlight active parent menu item, if any
336
- this . active . parent ( ) . closest ( ".ui-menu-item" ) . children ( "a:first" ) . addClass ( "ui-state-active" ) ;
341
+ this . active
342
+ . parent ( )
343
+ . closest ( ".ui-menu-item" )
344
+ . children ( "a:first" )
345
+ . addClass ( "ui-state-active" ) ;
337
346
338
347
if ( event && event . type === "keydown" ) {
339
348
this . _close ( ) ;
@@ -401,18 +410,18 @@ $.widget( "ui.menu", {
401
410
} ,
402
411
403
412
_open : function ( submenu ) {
413
+ var position = $ . extend ( {
414
+ of : this . active
415
+ } , $ . type ( this . options . position ) === "function" ?
416
+ this . options . position ( this . active ) :
417
+ this . options . position
418
+ ) ;
419
+
404
420
clearTimeout ( this . timer ) ;
405
421
this . element . find ( ".ui-menu" ) . not ( submenu . parents ( ) )
406
422
. hide ( )
407
423
. attr ( "aria-hidden" , "true" ) ;
408
424
409
- var position = $ . extend ( { } , {
410
- of : this . active
411
- } , $ . type ( this . options . position ) === "function" ?
412
- this . options . position ( this . active ) :
413
- this . options . position
414
- ) ;
415
-
416
425
submenu
417
426
. show ( )
418
427
. removeAttr ( "aria-hidden" )
@@ -476,7 +485,7 @@ $.widget( "ui.menu", {
476
485
if ( newItem && newItem . length ) {
477
486
this . _open ( newItem . parent ( ) ) ;
478
487
479
- //timeout so Firefox will not hide activedescendant change in expanding submenu from AT
488
+ // timeout so Firefox will not hide activedescendant change in expanding submenu from AT
480
489
this . _delay ( function ( ) {
481
490
this . focus ( event , newItem ) ;
482
491
} , 20 ) ;
0 commit comments