@@ -64,12 +64,13 @@ $.widget( "ui.menubar", {
64
64
active . prev ( ) . focus ( ) ;
65
65
}
66
66
} ,
67
- focusin : function ( event ) {
67
+ focusin : function ( ) {
68
68
clearTimeout ( menubar . closeTimer ) ;
69
69
} ,
70
70
focusout : function ( event ) {
71
71
menubar . closeTimer = setTimeout ( function ( ) {
72
72
menubar . _close ( event ) ;
73
+ menubar . _reenableTabIndexOnFirstMenuItem ( ) ;
73
74
} , 150 ) ;
74
75
} ,
75
76
"mouseleave .ui-menubar-item" : function ( event ) {
@@ -79,15 +80,14 @@ $.widget( "ui.menubar", {
79
80
} , 150 ) ;
80
81
}
81
82
} ,
82
- "mouseenter .ui-menubar-item" : function ( event ) {
83
+ "mouseenter .ui-menubar-item" : function ( ) {
83
84
clearTimeout ( menubar . closeTimer ) ;
84
85
}
85
86
} ) ;
86
87
} ,
87
88
88
89
_initializeMenuItems : function ( ) {
89
- var $item ,
90
- menubar = this ;
90
+ var menubar = this ;
91
91
92
92
this . menuItems
93
93
. addClass ( "ui-menubar-item" )
@@ -122,6 +122,8 @@ $.widget( "ui.menubar", {
122
122
menubar . _determineSubmenuStatus ( $menuItem , menubar ) ;
123
123
menubar . _styleMenuItem ( $menuItem , menubar ) ;
124
124
125
+ $menuItem . data ( "name" , $item . text ( ) ) ;
126
+
125
127
if ( $menuItem . data ( "hasSubMenu" ) ) {
126
128
menubar . _initializeSubMenu ( $menuItem , menubar ) ;
127
129
}
@@ -137,7 +139,7 @@ $.widget( "ui.menubar", {
137
139
$menuItem . data ( "hasSubMenu" , hasSubMenu ) ;
138
140
} ,
139
141
140
- _styleMenuItem : function ( $menuItem , menubar ) {
142
+ _styleMenuItem : function ( $menuItem ) {
141
143
$menuItem . css ( {
142
144
"border-width" : "1px" ,
143
145
"border-style" : "hidden"
@@ -178,7 +180,9 @@ $.widget( "ui.menubar", {
178
180
case $ . ui . keyCode . LEFT :
179
181
parentButton = menubar . active . prev ( ".ui-button" ) ;
180
182
181
- if ( parentButton . parent ( ) . prev ( ) . data ( 'hasSubMenu' ) ) {
183
+ if ( this . openSubmenus ) {
184
+ this . openSubmenus -- ;
185
+ } else if ( parentButton . parent ( ) . prev ( ) . data ( "hasSubMenu" ) ) {
182
186
menubar . active . blur ( ) ;
183
187
menubar . _open ( event , parentButton . parent ( ) . prev ( ) . find ( ".ui-menu" ) ) ;
184
188
} else {
@@ -196,7 +200,7 @@ $.widget( "ui.menubar", {
196
200
}
197
201
} ,
198
202
focusout : function ( event ) {
199
- event . stopImmediatePropagation ( ) ;
203
+ $ ( event . target ) . removeClass ( "ui-state-focus" ) ;
200
204
}
201
205
} ) ;
202
206
} ,
@@ -235,10 +239,10 @@ $.widget( "ui.menubar", {
235
239
236
240
__applyMouseAndKeyboardBehaviorForMenuItem : function ( $anItem , menubar ) {
237
241
menubar . _on ( $anItem , {
238
- focus : function ( event ) {
242
+ focus : function ( ) {
239
243
$anItem . addClass ( "ui-state-focus" ) ;
240
244
} ,
241
- focusout : function ( event ) {
245
+ focusout : function ( ) {
242
246
$anItem . removeClass ( "ui-state-focus" ) ;
243
247
}
244
248
} ) ;
@@ -320,15 +324,15 @@ $.widget( "ui.menubar", {
320
324
menubar . _off ( $anItem , "click mouseenter" ) ;
321
325
menubar . _hoverable ( $anItem ) ;
322
326
menubar . _on ( $anItem , {
323
- click : function ( event ) {
327
+ click : function ( ) {
324
328
if ( this . active ) {
325
329
this . _close ( ) ;
326
330
} else {
327
331
this . open = true ;
328
332
this . active = $ ( $anItem ) . parent ( ) ;
329
333
}
330
334
} ,
331
- mouseenter : function ( event ) {
335
+ mouseenter : function ( ) {
332
336
if ( this . open ) {
333
337
this . stashedOpenMenu = this . active ;
334
338
this . _close ( ) ;
@@ -367,7 +371,7 @@ $.widget( "ui.menubar", {
367
371
. removeAttr ( "role" )
368
372
. removeAttr ( "aria-haspopup" )
369
373
// TODO unwrap?
370
- . children ( "span.ui-button-text" ) . each ( function ( i , e ) {
374
+ . children ( "span.ui-button-text" ) . each ( function ( ) {
371
375
var item = $ ( this ) ;
372
376
item . parent ( ) . html ( item . html ( ) ) ;
373
377
} )
@@ -445,25 +449,30 @@ $.widget( "ui.menubar", {
445
449
. removeAttr ( "aria-hidden" )
446
450
. attr ( "aria-expanded" , "true" )
447
451
. menu ( "focus" , event , menu . children ( ".ui-menu-item" ) . first ( ) )
448
- // TODO need a comment here why both events are triggered
449
- . focus ( )
450
- . focusin ( ) ;
452
+ . focus ( ) // Establish focus on the submenu item
453
+ . focusin ( ) ; // Move focus within the containing submenu
454
+
451
455
452
456
this . open = true ;
453
457
} ,
454
458
459
+ _shouldOpenNestedSubMenu : function ( ) {
460
+ return this . open &&
461
+ this . active &&
462
+ this . active . closest ( this . options . items ) . data ( "hasSubMenu" ) &&
463
+ this . active . data ( "uiMenu" ) &&
464
+ this . active . data ( "uiMenu" ) . active &&
465
+ this . active . data ( "uiMenu" ) . active . has ( ".ui-menu" ) . length ;
466
+ } ,
467
+
455
468
next : function ( event ) {
456
- if ( this . open && this . active &&
457
- this . active . closest ( this . options . items ) . data ( "hasSubMenu" ) &&
458
- this . active . data ( "menu" ) . active &&
459
- this . active . data ( "menu" ) . active . has ( ".ui-menu" ) . length ) {
469
+ if ( this . _shouldOpenNestedSubMenu ( ) ) {
460
470
// Track number of open submenus and prevent moving to next menubar item
461
471
this . openSubmenus ++ ;
462
472
return ;
463
473
}
464
474
this . openSubmenus = 0 ;
465
475
this . _move ( "next" , "first" , event ) ;
466
-
467
476
} ,
468
477
469
478
previous : function ( event ) {
@@ -481,9 +490,6 @@ $.widget( "ui.menubar", {
481
490
} ,
482
491
483
492
_move : function ( direction , filter , event ) {
484
- var next ,
485
- wrapItem ;
486
-
487
493
var closestMenuItem = $ ( event . target ) . closest ( ".ui-menubar-item" ) ,
488
494
nextMenuItem = closestMenuItem . data ( direction + "MenuItem" ) ,
489
495
focusableTarget = this . _findNextFocusableTarget ( nextMenuItem ) ;
@@ -494,35 +500,47 @@ $.widget( "ui.menubar", {
494
500
} else {
495
501
this . _submenuless_open ( event , nextMenuItem ) ;
496
502
}
503
+ } else {
504
+ closestMenuItem . find ( ".ui-button" ) . attr ( "tabindex" , - 1 ) ;
505
+ focusableTarget . focus ( ) ;
497
506
}
498
-
499
- focusableTarget . focus ( ) ;
500
507
} ,
501
508
502
- _submenuless_open : function ( event , next ) {
503
- var button ,
504
- menuItem = next . closest ( ".ui-menubar-item" ) ;
509
+ _submenuless_open : function ( event , nextMenuItem ) {
510
+ var menuItem = $ ( event . target ) . closest ( ".ui-menubar-item" ) ;
505
511
506
- if ( this . active && this . active . length ) {
507
- // TODO refactor, almost the same as _close above, but don't remove tabIndex
508
- if ( this . active . closest ( this . options . items ) ) {
512
+ if ( this . active && this . active . length && menuItem . data ( "hasSubMenu" ) ) {
509
513
this . active
510
514
. menu ( "collapseAll" )
511
515
. hide ( )
512
516
. attr ( {
513
517
"aria-hidden" : "true" ,
514
518
"aria-expanded" : "false"
515
519
} ) ;
516
- }
517
- this . active . closest ( this . options . items )
518
- . removeClass ( "ui-state-active" ) ;
520
+ menuItem . removeClass ( "ui-state-active" ) ;
519
521
}
520
522
521
- // set tabIndex -1 to have the button skipped on shift-tab when menu is open (it gets focus)
522
- button = menuItem . attr ( "tabIndex" , - 1 ) ;
523
+ nextMenuItem . find ( ".ui-button" ) . focus ( ) ;
523
524
524
525
this . open = true ;
525
- this . active = menuItem ;
526
+ } ,
527
+
528
+ _closeOpenMenu : function ( menu ) {
529
+ menu
530
+ . menu ( "collapseAll" )
531
+ . hide ( )
532
+ . attr ( {
533
+ "aria-hidden" : "true" ,
534
+ "aria-expanded" : "false"
535
+ } ) ;
536
+ } ,
537
+
538
+ _deactivateMenusParentButton : function ( menu ) {
539
+ menu . parent ( ".ui-menubar-item" ) . removeClass ( "ui-state-active" ) ;
540
+ } ,
541
+
542
+ _reenableTabIndexOnFirstMenuItem : function ( ) {
543
+ $ ( this . menuItems [ 0 ] ) . find ( ".ui-widget" ) . attr ( "tabindex" , 1 ) ;
526
544
}
527
545
528
546
} ) ;
0 commit comments