@@ -38,6 +38,7 @@ return $.widget( "ui.menu", {
38
38
defaultElement : "<ul>" ,
39
39
delay : 300 ,
40
40
options : {
41
+ classes : { } ,
41
42
icons : {
42
43
submenu : "ui-icon-caret-1-e"
43
44
} ,
@@ -63,20 +64,19 @@ return $.widget( "ui.menu", {
63
64
this . mouseHandled = false ;
64
65
this . element
65
66
. uniqueId ( )
66
- . addClass ( "ui-menu ui-widget ui-widget-content" )
67
- . toggleClass ( "ui-menu-icons" , ! ! this . element . find ( ".ui-icon" ) . length )
68
67
. attr ( {
69
68
role : this . options . role ,
70
69
tabIndex : 0
71
70
} ) ;
72
71
73
72
if ( this . options . disabled ) {
74
- this . element
75
- . addClass ( "ui-state-disabled" )
76
- . attr ( "aria-disabled" , "true" ) ;
73
+ this . _addClass ( null , "ui-state-disabled" ) ;
74
+ this . element . attr ( "aria-disabled" , "true" ) ;
77
75
}
78
76
77
+ this . _addClass ( "ui-menu" , "ui-widget ui-widget-content" ) ;
79
78
this . _on ( {
79
+
80
80
// Prevent focus from sticking to links inside menu after clicking
81
81
// them (focus should always stay on UL during navigation).
82
82
"mousedown .ui-menu-item" : function ( event ) {
@@ -118,8 +118,8 @@ return $.widget( "ui.menu", {
118
118
var target = $ ( event . currentTarget ) ;
119
119
// Remove ui-state-active class from siblings of the newly focused menu item
120
120
// to avoid a jump caused by adjacent elements both having a class with a border
121
- target . siblings ( ) . children ( ".ui-state-active" ) . removeClass ( "ui-state-active" ) ;
122
-
121
+ this . _removeClass ( target . siblings ( ) . children ( ".ui-state-active" ) ,
122
+ null , "ui-state-active" ) ;
123
123
this . focus ( event , target ) ;
124
124
} ,
125
125
mouseleave : "collapseAll" ,
@@ -159,11 +159,19 @@ return $.widget( "ui.menu", {
159
159
} ,
160
160
161
161
_destroy : function ( ) {
162
+ var items = this . element . find ( ".ui-menu-item" )
163
+ . removeAttr ( "role" )
164
+ . removeAttr ( "aria-disabled" ) ,
165
+ submenus = items . children ( ".ui-menu-item-wrapper" )
166
+ . removeUniqueId ( )
167
+ . removeAttr ( "tabIndex" )
168
+ . removeAttr ( "role" )
169
+ . removeAttr ( "aria-haspopup" ) ;
170
+
162
171
// Destroy (sub)menus
163
172
this . element
164
173
. removeAttr ( "aria-activedescendant" )
165
174
. find ( ".ui-menu" ) . addBack ( )
166
- . removeClass ( "ui-menu ui-widget ui-widget-content ui-menu-icons ui-front" )
167
175
. removeAttr ( "role" )
168
176
. removeAttr ( "tabIndex" )
169
177
. removeAttr ( "aria-labelledby" )
@@ -173,26 +181,12 @@ return $.widget( "ui.menu", {
173
181
. removeUniqueId ( )
174
182
. show ( ) ;
175
183
176
- // Destroy menu items
177
- this . element . find ( ".ui-menu-item" )
178
- . removeClass ( "ui-menu-item" )
179
- . removeAttr ( "role" )
180
- . removeAttr ( "aria-disabled" )
181
- . children ( ".ui-menu-item-wrapper" )
182
- . removeUniqueId ( )
183
- . removeClass ( "ui-menu-item-wrapper ui-state-hover" )
184
- . removeAttr ( "tabIndex" )
185
- . removeAttr ( "role" )
186
- . removeAttr ( "aria-haspopup" )
187
- . children ( ) . each ( function ( ) {
188
- var elem = $ ( this ) ;
189
- if ( elem . data ( "ui-menu-submenu-caret" ) ) {
190
- elem . remove ( ) ;
191
- }
192
- } ) ;
193
-
194
- // Destroy menu dividers
195
- this . element . find ( ".ui-menu-divider" ) . removeClass ( "ui-menu-divider ui-widget-content" ) ;
184
+ submenus . children ( ) . each ( function ( ) {
185
+ var elem = $ ( this ) ;
186
+ if ( elem . data ( "ui-menu-submenu-caret" ) ) {
187
+ elem . remove ( ) ;
188
+ }
189
+ } ) ;
196
190
} ,
197
191
198
192
_keydown : function ( event ) {
@@ -286,16 +280,15 @@ return $.widget( "ui.menu", {
286
280
} ,
287
281
288
282
refresh : function ( ) {
289
- var menus , items ,
283
+ var menus , items , newSubmenus , newItems , newWrappers ,
290
284
that = this ,
291
285
icon = this . options . icons . submenu ,
292
286
submenus = this . element . find ( this . options . menus ) ;
293
287
294
- this . element . toggleClass ( "ui-menu-icons" , ! ! this . element . find ( ".ui-icon" ) . length ) ;
288
+ this . _toggleClass ( "ui-menu-icons" , null , ! ! this . element . find ( ".ui-icon" ) . length ) ;
295
289
296
290
// Initialize nested menus
297
- submenus . filter ( ":not(.ui-menu)" )
298
- . addClass ( "ui-menu ui-widget ui-widget-content ui-front" )
291
+ newSubmenus = submenus . filter ( ":not(.ui-menu)" )
299
292
. hide ( )
300
293
. attr ( {
301
294
role : this . options . role ,
@@ -305,38 +298,39 @@ return $.widget( "ui.menu", {
305
298
. each ( function ( ) {
306
299
var menu = $ ( this ) ,
307
300
item = menu . prev ( ) ,
308
- submenuCaret = $ ( "<span>" )
309
- . addClass ( "ui-menu-icon ui-icon " + icon )
310
- . data ( "ui-menu-submenu-caret" , true ) ;
301
+ submenuCaret = $ ( "<span>" ) . data ( "ui-menu-submenu-caret" , true ) ;
311
302
303
+ that . _addClass ( submenuCaret , "ui-menu-icon" , "ui-icon " + icon ) ;
312
304
item
313
305
. attr ( "aria-haspopup" , "true" )
314
306
. prepend ( submenuCaret ) ;
315
307
menu . attr ( "aria-labelledby" , item . attr ( "id" ) ) ;
316
308
} ) ;
317
309
310
+ this . _addClass ( newSubmenus , "ui-menu" , "ui-widget ui-widget-content ui-front" ) ;
311
+
318
312
menus = submenus . add ( this . element ) ;
319
313
items = menus . find ( this . options . items ) ;
320
314
321
315
// Initialize menu-items containing spaces and/or dashes only as dividers
322
316
items . not ( ".ui-menu-item" ) . each ( function ( ) {
323
317
var item = $ ( this ) ;
324
318
if ( that . _isDivider ( item ) ) {
325
- item . addClass ( "ui-widget-content ui-menu-divider " ) ;
319
+ that . _addClass ( item , "ui-menu-divider" , " ui-widget-content " ) ;
326
320
}
327
321
} ) ;
328
322
329
323
// Don't refresh list items that are already adapted
330
- items . not ( ".ui-menu-item, .ui-menu-divider" )
331
- . addClass ( "ui-menu-item" )
332
- . children ( )
333
- . not ( ".ui-menu" )
334
- . addClass ( "ui-menu-item-wrapper" )
335
- . uniqueId ( )
336
- . attr ( {
337
- tabIndex : - 1 ,
338
- role : this . _itemRole ( )
339
- } ) ;
324
+ newItems = items . not ( ".ui-menu-item, .ui-menu-divider" ) ;
325
+ newWrappers = newItems . children ( )
326
+ . not ( ".ui-menu" )
327
+ . uniqueId ( )
328
+ . attr ( {
329
+ tabIndex : - 1 ,
330
+ role : this . _itemRole ( )
331
+ } ) ;
332
+ this . _addClass ( newItems , "ui-menu-item" )
333
+ . _addClass ( newWrappers , "ui-menu-item-wrapper" ) ;
340
334
341
335
// Add aria-disabled attribute to any disabled menu item
342
336
items . filter ( ".ui-state-disabled" ) . attr ( "aria-disabled" , "true" ) ;
@@ -356,26 +350,27 @@ return $.widget( "ui.menu", {
356
350
357
351
_setOption : function ( key , value ) {
358
352
if ( key === "icons" ) {
359
- this . element . find ( ".ui-menu-icon" )
360
- . removeClass ( this . options . icons . submenu )
361
- . addClass ( value . submenu ) ;
353
+ var icons = this . element . find ( ".ui-menu-icon" ) ;
354
+ this . _removeClass ( icons , null , this . options . icons . submenu )
355
+ . _addClass ( icons , null , value . submenu ) ;
362
356
}
363
357
if ( key === "disabled" ) {
364
- this . element
365
- . toggleClass ( "ui-state-disabled" , ! ! value )
366
- . attr ( "aria-disabled" , value ) ;
358
+ this . element . attr ( "aria-disabled" , value ) ;
359
+ this . _toggleClass ( null , "ui-state-disabled" , ! ! value ) ;
367
360
}
368
361
this . _super ( key , value ) ;
369
362
} ,
370
363
371
364
focus : function ( event , item ) {
372
- var nested , focused ;
365
+ var nested , focused , activeParent ;
373
366
this . blur ( event , event && event . type === "focus" ) ;
374
367
375
368
this . _scrollIntoView ( item ) ;
376
369
377
370
this . active = item . first ( ) ;
378
- focused = this . active . children ( ".ui-menu-item-wrapper" ) . addClass ( "ui-state-active" ) ;
371
+
372
+ focused = this . active . children ( ".ui-menu-item-wrapper" ) ;
373
+ this . _addClass ( focused , null , "ui-state-active" ) ;
379
374
380
375
// Only update aria-activedescendant if there's a role
381
376
// otherwise we assume focus is managed elsewhere
@@ -384,11 +379,11 @@ return $.widget( "ui.menu", {
384
379
}
385
380
386
381
// Highlight active parent menu item, if any
387
- this . active
382
+ activeParent = this . active
388
383
. parent ( )
389
384
. closest ( ".ui-menu-item" )
390
- . children ( ".ui-menu-item-wrapper" )
391
- . addClass ( "ui-state-active" ) ;
385
+ . children ( ".ui-menu-item-wrapper" ) ;
386
+ this . _addClass ( activeParent , null , "ui-state-active" ) ;
392
387
393
388
if ( event && event . type === "keydown" ) {
394
389
this . _close ( ) ;
@@ -434,7 +429,8 @@ return $.widget( "ui.menu", {
434
429
return ;
435
430
}
436
431
437
- this . active . children ( ".ui-menu-item-wrapper" ) . removeClass ( "ui-state-active" ) ;
432
+ this . _removeClass ( this . active . children ( ".ui-menu-item-wrapper" ) ,
433
+ null , "ui-state-active" ) ;
438
434
this . active = null ;
439
435
440
436
this . _trigger ( "blur" , event , { item : this . active } ) ;
@@ -498,14 +494,14 @@ return $.widget( "ui.menu", {
498
494
startMenu = this . active ? this . active . parent ( ) : this . element ;
499
495
}
500
496
501
- startMenu
497
+ var active = startMenu
502
498
. find ( ".ui-menu" )
503
499
. hide ( )
504
500
. attr ( "aria-hidden" , "true" )
505
501
. attr ( "aria-expanded" , "false" )
506
502
. end ( )
507
- . find ( ".ui-state-active" ) . not ( ".ui-menu-item-wrapper" )
508
- . removeClass ( "ui-state-active" ) ;
503
+ . find ( ".ui-state-active" ) . not ( ".ui-menu-item-wrapper" ) ;
504
+ this . _removeClass ( active , null , "ui-state-active" ) ;
509
505
} ,
510
506
511
507
_closeOnDocumentClick : function ( event ) {
0 commit comments