Menu: Look into submenus for uninitialized menu items. Fixes #8773 - Menu: refresh() doesn't refresh existing submenus.

This commit is contained in:
Jörn Zaefferer 2012-11-05 18:37:48 +01:00
parent 8bdf0359bb
commit 8b3e570241
2 changed files with 33 additions and 23 deletions

View File

@ -60,6 +60,15 @@ test( "refresh", function() {
equal( element.find( ".ui-menu-item" ).length, 5, "Incorrect number of menu items" ); equal( element.find( ".ui-menu-item" ).length, 5, "Incorrect number of menu items" );
}); });
test( "refresh submenu", function() {
expect( 2 );
var element = $( "#menu2" ).menu();
equal( element.find( "ul:first .ui-menu-item" ).length, 3 );
element.find( "ul" ).andSelf().append( "<li><a href=\"#\">New Item</a></li>" );
element.menu("refresh");
equal( element.find( "ul:first .ui-menu-item" ).length, 4 );
});
test( "widget", function() { test( "widget", function() {
expect( 2 ); expect( 2 );
var element = $( "#menu1" ).menu(), var element = $( "#menu1" ).menu(),

47
ui/jquery.ui.menu.js vendored
View File

@ -277,21 +277,35 @@ $.widget( "ui.menu", {
}, },
refresh: function() { refresh: function() {
// Initialize nested menus
var menus, var menus,
icon = this.options.icons.submenu, icon = this.options.icons.submenu,
submenus = this.element.find( this.options.menus + ":not(.ui-menu)" ) submenus = this.element.find( this.options.menus );
.addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
.hide() // Initialize nested menus
.attr({ submenus.filter( ":not(.ui-menu)" )
role: this.options.role, .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
"aria-hidden": "true", .hide()
"aria-expanded": "false" .attr({
}); role: this.options.role,
"aria-hidden": "true",
"aria-expanded": "false"
})
.each(function() {
var menu = $( this ),
item = menu.prev( "a" ),
submenuCarat = $( "<span>" )
.addClass( "ui-menu-icon ui-icon " + icon )
.data( "ui-menu-submenu-carat", true );
item
.attr( "aria-haspopup", "true" )
.prepend( submenuCarat );
menu.attr( "aria-labelledby", item.attr( "id" ) );
});
// Don't refresh list items that are already adapted
menus = submenus.add( this.element ); menus = submenus.add( this.element );
// Don't refresh list items that are already adapted
menus.children( ":not(.ui-menu-item):has(a)" ) menus.children( ":not(.ui-menu-item):has(a)" )
.addClass( "ui-menu-item" ) .addClass( "ui-menu-item" )
.attr( "role", "presentation" ) .attr( "role", "presentation" )
@ -315,19 +329,6 @@ $.widget( "ui.menu", {
// Add aria-disabled attribute to any disabled menu item // Add aria-disabled attribute to any disabled menu item
menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" ); menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
submenus.each(function() {
var menu = $( this ),
item = menu.prev( "a" ),
submenuCarat = $( "<span>" )
.addClass( "ui-menu-icon ui-icon " + icon )
.data( "ui-menu-submenu-carat", true );
item
.attr( "aria-haspopup", "true" )
.prepend( submenuCarat );
menu.attr( "aria-labelledby", item.attr( "id" ) );
});
// If the active item has been removed, blur the menu // If the active item has been removed, blur the menu
if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) { if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
this.blur(); this.blur();