Skip to content

Commit 9e0071f

Browse files
jzaeffererscottgonzalez
authored andcommitted
Menu: Look into submenus for uninitialized menu items. Fixes #8773 - Menu: refresh() doesn't refresh existing submenus.
(cherry picked from commit 8b3e570)
1 parent e65f3ff commit 9e0071f

File tree

2 files changed

+33
-23
lines changed

2 files changed

+33
-23
lines changed

tests/unit/menu/menu_methods.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,15 @@ test( "refresh", function() {
6060
equal( element.find( ".ui-menu-item" ).length, 5, "Incorrect number of menu items" );
6161
});
6262

63+
test( "refresh submenu", function() {
64+
expect( 2 );
65+
var element = $( "#menu2" ).menu();
66+
equal( element.find( "ul:first .ui-menu-item" ).length, 3 );
67+
element.find( "ul" ).andSelf().append( "<li><a href=\"#\">New Item</a></li>" );
68+
element.menu("refresh");
69+
equal( element.find( "ul:first .ui-menu-item" ).length, 4 );
70+
});
71+
6372
test( "widget", function() {
6473
expect( 2 );
6574
var element = $( "#menu1" ).menu(),

ui/jquery.ui.menu.js

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -277,21 +277,35 @@ $.widget( "ui.menu", {
277277
},
278278

279279
refresh: function() {
280-
// Initialize nested menus
281280
var menus,
282281
icon = this.options.icons.submenu,
283-
submenus = this.element.find( this.options.menus + ":not(.ui-menu)" )
284-
.addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
285-
.hide()
286-
.attr({
287-
role: this.options.role,
288-
"aria-hidden": "true",
289-
"aria-expanded": "false"
290-
});
282+
submenus = this.element.find( this.options.menus );
283+
284+
// Initialize nested menus
285+
submenus.filter( ":not(.ui-menu)" )
286+
.addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
287+
.hide()
288+
.attr({
289+
role: this.options.role,
290+
"aria-hidden": "true",
291+
"aria-expanded": "false"
292+
})
293+
.each(function() {
294+
var menu = $( this ),
295+
item = menu.prev( "a" ),
296+
submenuCarat = $( "<span>" )
297+
.addClass( "ui-menu-icon ui-icon " + icon )
298+
.data( "ui-menu-submenu-carat", true );
299+
300+
item
301+
.attr( "aria-haspopup", "true" )
302+
.prepend( submenuCarat );
303+
menu.attr( "aria-labelledby", item.attr( "id" ) );
304+
});
291305

292-
// Don't refresh list items that are already adapted
293306
menus = submenus.add( this.element );
294307

308+
// Don't refresh list items that are already adapted
295309
menus.children( ":not(.ui-menu-item):has(a)" )
296310
.addClass( "ui-menu-item" )
297311
.attr( "role", "presentation" )
@@ -315,19 +329,6 @@ $.widget( "ui.menu", {
315329
// Add aria-disabled attribute to any disabled menu item
316330
menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
317331

318-
submenus.each(function() {
319-
var menu = $( this ),
320-
item = menu.prev( "a" ),
321-
submenuCarat = $( "<span>" )
322-
.addClass( "ui-menu-icon ui-icon " + icon )
323-
.data( "ui-menu-submenu-carat", true );
324-
325-
item
326-
.attr( "aria-haspopup", "true" )
327-
.prepend( submenuCarat );
328-
menu.attr( "aria-labelledby", item.attr( "id" ) );
329-
});
330-
331332
// If the active item has been removed, blur the menu
332333
if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
333334
this.blur();

0 commit comments

Comments
 (0)