Skip to content

Commit 94317d7

Browse files
committed
Menu: Added autoCollapse as the default and added a unit test
1 parent 38028f6 commit 94317d7

File tree

2 files changed

+48
-16
lines changed

2 files changed

+48
-16
lines changed

tests/unit/menu/menu_events.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,25 @@ test( "handle blur: click", function() {
4141
$("#remove").remove();
4242
});
4343

44+
asyncTest( "handle submenu auto collapse: mouseleave", function() {
45+
expect( 4 );
46+
var $menu = $( "#menu2" ).menu();
47+
48+
$menu.find( "li:nth-child(7)" ).trigger( "mouseover" );
49+
setTimeout(function() {
50+
equal( $menu.find( "ul[aria-expanded='true']" ).length, 1, "first submenu expanded" );
51+
$menu.find( "li:nth-child(7) li:first" ).trigger( "mouseover" );
52+
setTimeout(function() {
53+
equal( $menu.find( "ul[aria-expanded='true']" ).length, 2, "second submenu expanded" );
54+
$menu.find( "ul[aria-expanded='true']:first" ).trigger( "mouseleave" );
55+
equal( $menu.find( "ul[aria-expanded='true']" ).length, 1, "second submenu collapsed" );
56+
$menu.trigger( "mouseleave" );
57+
equal( $menu.find( "ul[aria-expanded='true']" ).length, 0, "first submenu collapsed" );
58+
start();
59+
}, 400);
60+
}, 200);
61+
});
62+
4463
test("handle keyboard navigation on menu without scroll and without submenus", function() {
4564
expect(12);
4665
var element = $('#menu1').menu({

ui/jquery.ui.menu.js

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ $.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",
6567
"mouseout .ui-menu-item": "blur",
6668
"focus": function( event ) {
6769
this.focus( event, $( event.target ).children( ".ui-menu-item:first" ) );
@@ -346,21 +348,30 @@ $.widget( "ui.menu", {
346348
},
347349

348350
collapseAll: function( event ) {
349-
this.element
350-
.find( "ul" )
351-
.hide()
352-
.attr( "aria-hidden", "true" )
353-
.attr( "aria-expanded", "false" )
354-
.end()
355-
.find( "a.ui-state-active" )
356-
.removeClass( "ui-state-active" );
351+
var currentMenu = false;
352+
if ( event ) {
353+
var target = $( event.target );
354+
if ( target.is( "ui.menu" ) ) {
355+
currentMenu = target;
356+
} else if ( target.closest( ".ui-menu" ).length ) {
357+
currentMenu = target.closest( ".ui-menu" );
358+
}
359+
}
357360

358-
this.blur( event );
359-
this.activeMenu = this.element;
361+
this._close( currentMenu );
362+
363+
if( !currentMenu ) {
364+
this.blur( event );
365+
this.activeMenu = this.element;
366+
}
360367
},
361368

362-
_close: function() {
363-
this.active.parent()
369+
_close: function( startMenu ) {
370+
if( !startMenu ) {
371+
startMenu = this.active ? this.active.parent() : this.element;
372+
}
373+
374+
startMenu
364375
.find( "ul" )
365376
.hide()
366377
.attr( "aria-hidden", "true" )
@@ -373,10 +384,7 @@ $.widget( "ui.menu", {
373384
collapse: function( event ) {
374385
var newItem = this.active && this.active.parents("li:not(.ui-menubar-item)").first();
375386
if ( newItem && newItem.length ) {
376-
this.active.parent()
377-
.attr("aria-hidden", "true")
378-
.attr("aria-expanded", "false")
379-
.hide();
387+
this._close();
380388
this.focus( event, newItem );
381389
return true;
382390
}
@@ -486,6 +494,11 @@ $.widget( "ui.menu", {
486494
return this.element.height() < this.element.prop( "scrollHeight" );
487495
},
488496

497+
_mouseleave: function( event ) {
498+
this.collapseAll( event );
499+
this.blur();
500+
},
501+
489502
select: function( event ) {
490503
// save active reference before collapseAll triggers blur
491504
var ui = {

0 commit comments

Comments
 (0)