@@ -62,13 +62,19 @@ $.widget( "ui.menu", {
62
62
target . siblings ( ) . children ( ".ui-state-active" ) . removeClass ( "ui-state-active" ) ;
63
63
this . focus ( event , target ) ;
64
64
} ,
65
- "mouseleave" : "_mouseleave " ,
66
- "mouseleave .ui-menu" : "_mouseleave " ,
65
+ "mouseleave" : "collapseAll " ,
66
+ "mouseleave .ui-menu" : "collapseAll " ,
67
67
"mouseout .ui-menu-item" : "blur" ,
68
68
"focus" : function ( event ) {
69
69
this . focus ( event , $ ( event . target ) . children ( ".ui-menu-item:first" ) ) ;
70
70
} ,
71
- "blur" : "collapseAll"
71
+ blur : function ( event ) {
72
+ this . _delay ( function ( ) {
73
+ if ( ! $ . contains ( this . element [ 0 ] , document . activeElement ) ) {
74
+ this . collapseAll ( event ) ;
75
+ }
76
+ } , 0 ) ;
77
+ }
72
78
} ) ;
73
79
74
80
this . refresh ( ) ;
@@ -341,25 +347,25 @@ $.widget( "ui.menu", {
341
347
. position ( position ) ;
342
348
} ,
343
349
344
- collapseAll : function ( event ) {
345
- var currentMenu = false ;
346
- if ( event ) {
347
- var target = $ ( event . target ) ;
348
- if ( target . is ( "ui. menu" ) ) {
349
- currentMenu = target ;
350
- } else if ( target . closest ( ".ui- menu" ) . length ) {
351
- currentMenu = target . closest ( ".ui-menu" ) ;
352
- }
350
+ collapseAll : function ( event , all ) {
351
+
352
+ // if we were passed an event, look for the submenu that contains the event
353
+ var currentMenu = all ? this . element :
354
+ $ ( event && event . target ) . closest ( this . element . find ( ".ui- menu" ) ) ;
355
+
356
+ // if we found no valid submenu ancestor, use the main menu to close all sub menus anyway
357
+ if ( ! currentMenu . length ) {
358
+ currentMenu = this . element ;
353
359
}
354
360
355
361
this . _close ( currentMenu ) ;
356
362
357
- if ( ! currentMenu ) {
358
- this . blur ( event ) ;
359
- this . activeMenu = this . element ;
360
- }
363
+ this . blur ( event ) ;
364
+ this . activeMenu = currentMenu ;
361
365
} ,
362
366
367
+ // With no arguments, closes the currently active menu - if nothing is active
368
+ // it closes all menus. If passed an argument, it will search for menus BELOW
363
369
_close : function ( startMenu ) {
364
370
if ( ! startMenu ) {
365
371
startMenu = this . active ? this . active . parent ( ) : this . element ;
@@ -487,17 +493,13 @@ $.widget( "ui.menu", {
487
493
return this . element . height ( ) < this . element . prop ( "scrollHeight" ) ;
488
494
} ,
489
495
490
- _mouseleave : function ( event ) {
491
- this . collapseAll ( event ) ;
492
- this . blur ( ) ;
493
- } ,
494
-
495
496
select : function ( event ) {
497
+
496
498
// save active reference before collapseAll triggers blur
497
499
var ui = {
498
500
item : this . active
499
501
} ;
500
- this . collapseAll ( event ) ;
502
+ this . collapseAll ( event , true ) ;
501
503
this . _trigger ( "select" , event , ui ) ;
502
504
}
503
505
} ) ;
0 commit comments