@@ -62,13 +62,19 @@ $.widget( "ui.menu", {
6262 target . siblings ( ) . children ( ".ui-state-active" ) . removeClass ( "ui-state-active" ) ;
6363 this . focus ( event , target ) ;
6464 } ,
65- "mouseleave" : "_mouseleave " ,
66- "mouseleave .ui-menu" : "_mouseleave " ,
65+ "mouseleave" : "collapseAll " ,
66+ "mouseleave .ui-menu" : "collapseAll " ,
6767 "mouseout .ui-menu-item" : "blur" ,
6868 "focus" : function ( event ) {
6969 this . focus ( event , $ ( event . target ) . children ( ".ui-menu-item:first" ) ) ;
7070 } ,
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+ }
7278 } ) ;
7379
7480 this . refresh ( ) ;
@@ -341,25 +347,25 @@ $.widget( "ui.menu", {
341347 . position ( position ) ;
342348 } ,
343349
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 ;
353359 }
354360
355361 this . _close ( currentMenu ) ;
356362
357- if ( ! currentMenu ) {
358- this . blur ( event ) ;
359- this . activeMenu = this . element ;
360- }
363+ this . blur ( event ) ;
364+ this . activeMenu = currentMenu ;
361365 } ,
362366
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
363369 _close : function ( startMenu ) {
364370 if ( ! startMenu ) {
365371 startMenu = this . active ? this . active . parent ( ) : this . element ;
@@ -487,17 +493,13 @@ $.widget( "ui.menu", {
487493 return this . element . height ( ) < this . element . prop ( "scrollHeight" ) ;
488494 } ,
489495
490- _mouseleave : function ( event ) {
491- this . collapseAll ( event ) ;
492- this . blur ( ) ;
493- } ,
494-
495496 select : function ( event ) {
497+
496498 // save active reference before collapseAll triggers blur
497499 var ui = {
498500 item : this . active
499501 } ;
500- this . collapseAll ( event ) ;
502+ this . collapseAll ( event , true ) ;
501503 this . _trigger ( "select" , event , ui ) ;
502504 }
503505} ) ;
0 commit comments