Menu Widget

jQuery

Menu Widget


Menu Widget version added: 1.9

Description: Themeable menu with mouse and keyboard interactions for navigation.

QuickNavExamples

A menu can be created from any valid markup as long as the elements have a strict parent/child relationship and each menu item has an anchor. The most commonly used element is the unordered list (<ul>):

<ul id="menu">
	<li><a >Item 1</a></li>
	<li><a >Item 2</a></li>
	<li><a >Item 3</a>
		<ul>
			<li><a >Item 3-1</a></li>
			<li><a >Item 3-2</a></li>
			<li><a >Item 3-3</a></li>
			<li><a >Item 3-4</a></li>
			<li><a >Item 3-5</a></li>
		</ul>
	</li>
	<li><a >Item 4</a></li>
	<li><a >Item 5</a></li>
</ul>

If you use a structure other than <ul>/<li>, including using the same element for the menu and the menu items, use the menus option to specify a way to differentiate the two elements, e.g., menus: "div.menuElement".

Any menu item can be disabled by adding the ui-state-disabled class to that element.

To add icons to the menu, include them in the markup:

<ul id="menu">
	<li><a ><span class="ui-icon ui-icon-disk"></span>Save</a></li>
</ul>

Menu automatically adds the necessary padding to items without icons.

Keyboard interaction

  • ENTER/SPACE: Invoke the focused menu item's action, which may be opening a submenu.
  • UP: Move focus to the previous menu item.
  • DOWN: Move focus to the next menu item.
  • RIGHT: Open the submenu, if available.
  • LEFT: Close the current submenu and move focus to the parent menu item. If not in a submenu, do nothing.
  • ESCAPE: Close the current submenu and move focus to the parent menu item. If not in a submenu, do nothing.

Typing a letter moves focus to the first item whose title starts with that character. Repeating the same character cycles through matching items. Typing more characters within the one second timer matches those characters.

Disabled items can receive keyboard focus, but do not allow any other interaction.

Dependencies

Additional Notes:

  • This widget requires some functional CSS, otherwise it won't work. If you build a custom theme, use the widget's specific CSS file as a starting point.

Options

disabledType: Boolean

Default: false
Disables the menu if set to true.
Code examples:

Initialize the menu with the disabled option specified:

1
                                  
$( ".selector" ).menu({ disabled: true });

Get or set the disabled option, after initialization:

1
2
3
4
5
                                  
// getter
var disabled = $( ".selector" ).menu( "option", "disabled" );
// setter
$( ".selector" ).menu( "option", "disabled", true );

iconsType: Object

Default: { submenu: "ui-icon-carat-1-e" }
Icons to use for submenus, matching an icon defined by the jQuery UI CSS Framework.
  • submenu (string, default: "ui-icon-carat-1-e")
Code examples:

Initialize the menu with the icons option specified:

1
                                  
$( ".selector" ).menu({ icons: { submenu: "ui-icon-circle-triangle-e" } });

Get or set the icons option, after initialization:

1
2
3
4
5
                                  
// getter
var icons = $( ".selector" ).menu( "option", "icons" );
// setter
$( ".selector" ).menu( "option", "icons", { submenu: "ui-icon-circle-triangle-e" } );

menusType: String

Default: "ul"

Selector for the elements that serve as the menu container, including sub-menus.

Note: The menus option should not be changed after initialization. Existing submenus will not be updated.

Code examples:

Initialize the menu with the menus option specified:

1
                                  
$( ".selector" ).menu({ menus: "div" });

Get or set the menus option, after initialization:

1
2
3
4
5
                                  
// getter
var menus = $( ".selector" ).menu( "option", "menus" );
// setter
$( ".selector" ).menu( "option", "menus", "div" );

positionType: Object

Default: { my: "left top", at: "right top" }
Identifies the position of submenus in relation to the associated parent menu item. The of option defaults to the parent menu item, but you can specify another element to position against. You can refer to the jQuery UI Position utility for more details about the various options.
Code examples:

Initialize the menu with the position option specified:

1
                                  
$( ".selector" ).menu({ position: { my: "left top", at: "right-5 top+5" } });

Get or set the position option, after initialization:

1
2
3
4
5
                                  
// getter
var position = $( ".selector" ).menu( "option", "position" );
// setter
$( ".selector" ).menu( "option", "position", { my: "left top", at: "right-5 top+5" } );

roleType: String

Default: "menu"

Customize the ARIA roles used for the menu and menu items. The default uses "menuitem" for items. Setting the role option to "listbox" will use "option" for items. If set to null, no roles will be set, which is useful if the menu is being controlled by another element that is maintaining focus.

Note: The role option should not be changed after initialization. Existing (sub)menus and menu items will not be updated.

Code examples:

Initialize the menu with the role option specified:

1
                                  
$( ".selector" ).menu({ role: null });

Get or set the role option, after initialization:

1
2
3
4
5
                                  
// getter
var role = $( ".selector" ).menu( "option", "role" );
// setter
$( ".selector" ).menu( "option", "role", null );

Methods

blur( [event ] )

Removes focus from a menu, resets any active element styles and triggers the menu's blur event.
  • event
    Type: Event
    What triggered the menu to blur.
Code examples:

Invoke the blur method:

1
                                      
$( ".selector" ).menu( "blur" );

collapse( [event ] )

Closes the currently active sub-menu.
  • event
    Type: Event
    What triggered the menu to collapse.
Code examples:

Invoke the collapse method:

1
                                      
$( ".selector" ).menu( "collapse" );

collapseAll( [event ] [, all ] )

Closes all open sub-menus.
  • event
    Type: Event
    What triggered the menu to collapse.
  • all
    Type: Boolean
    Indicates whether all sub-menus should be closed or only sub-menus below and including the menu that is or contains the target of the triggering event.
Code examples:

Invoke the collapseAll method:

1
                                      
$( ".selector" ).menu( "collapseAll", null, true );

destroy()

Removes the menu functionality completely. This will return the element back to its pre-init state.
  • This method does not accept any arguments.
Code examples:

Invoke the destroy method:

1
                                      
$( ".selector" ).menu( "destroy" );

disable()

Disables the menu.
  • This method does not accept any arguments.
Code examples:

Invoke the disable method:

1
                                      
$( ".selector" ).menu( "disable" );

enable()

Enables the menu.
  • This method does not accept any arguments.
Code examples:

Invoke the enable method:

1
                                      
$( ".selector" ).menu( "enable" );

expand( [event ] )

Opens the sub-menu below the currently active item, if one exists.
  • event
    Type: Event
    What triggered the menu to expand.
Code examples:

Invoke the expand method:

1
                                      
$( ".selector" ).menu( "expand" );

focus( [event ], item )

Activates a particular menu item, begins opening any sub-menu if present and triggers the menu's focus event.
  • event
    Type: Event
    What triggered the menu item to gain focus.
  • item
    Type: jQuery
    The menu item to focus/activate.
Code examples:

Invoke the focus method:

1
                                      
$( ".selector" ).menu( "focus", null, menu.find( ".ui-menu-item:last" ) );

isFirstItem()

Returns a boolean value stating whether or not the currently active item is the first item in the menu.
  • This method does not accept any arguments.
Code examples:

Invoke the isFirstItem method:

1
                                      
var firstItem = $( ".selector" ).menu( "isFirstItem" );

isLastItem()

Returns a boolean value stating whether or not the currently active item is the last item in the menu.
  • This method does not accept any arguments.
Code examples:

Invoke the isLastItem method:

1
                                      
var lastItem = $( ".selector" ).menu( "isLastItem" );

next( [event ] )

Moves active state to next menu item.
  • event
    Type: Event
    What triggered the focus to move.
Code examples:

Invoke the next method:

1
                                      
$( ".selector" ).menu( "next" );

nextPage( [event ] )

Moves active state to first menu item below the bottom of a scrollable menu or the last item if not scrollable.
  • event
    Type: Event
    What triggered the focus to move.
Code examples:

Invoke the nextPage method:

1
                                      
$( ".selector" ).menu( "nextPage" );

option( optionName )Returns: Object

Gets the value currently associated with the specified optionName.
  • optionName
    Type: String
    The name of the option to get.
Code examples:

Invoke the method:

1
                                      
var isDisabled = $( ".selector" ).menu( "option", "disabled" );

option()Returns: PlainObject

Gets an object containing key/value pairs representing the current menu options hash.
  • This method does not accept any arguments.
Code examples:

Invoke the method:

1
                                      
var options = $( ".selector" ).menu( "option" );

option( optionName, value )

Sets the value of the menu option associated with the specified optionName.
  • optionName
    Type: String
    The name of the option to set.
  • value
    Type: Object
    A value to set for the option.
Code examples:

Invoke the method:

1
                                      
$( ".selector" ).menu( "option", "disabled", true );

option( options )

Sets one or more options for the menu.
  • options
    Type: Object
    A map of option-value pairs to set.
Code examples:

Invoke the method:

1
                                      
$( ".selector" ).menu( "option", { disabled: true } );

previous( [event ] )

Moves active state to previous menu item.
  • event
    Type: Event
    What triggered the focus to move.
Code examples:

Invoke the previous method:

1
                                      
$( ".selector" ).menu( "previous" );

previousPage( [event ] )

Moves active state to first menu item above the top of a scrollable menu or the first item if not scrollable.
  • event
    Type: Event
    What triggered the focus to move.
Code examples:

Invoke the previousPage method:

1
                                      
$( ".selector" ).menu( "previousPage" );

refresh()

Initializes sub-menus and menu items that have not already been initialized. New menu items, including sub-menus can be added to the menu or all of the contents of the menu can be replaced and then initialized with the refresh() method.
  • This method does not accept any arguments.
Code examples:

Invoke the refresh method:

1
                                      
$( ".selector" ).menu( "refresh" );

select( [event ] )

Selects the currently active menu item, collapses all sub-menus and triggers the menu's select event.
  • event
    Type: Event
    What triggered the selection.
Code examples:

Invoke the select method:

1
                                      
$( ".selector" ).menu( "select" );

widget()Returns: jQuery

Returns a jQuery object containing the menu.
  • This method does not accept any arguments.
Code examples:

Invoke the widget method:

1
                                      
var widget = $( ".selector" ).menu( "widget" );

Events

blur( event, ui )Type: menublur

Triggered when the menu loses focus.
  • event
    Type: Event
  • ui
    Type: Object
    • item
      Type: jQuery
      The currently active menu item.
Code examples:

Initialize the menu with the blur callback specified:

1
2
3
                                    
$( ".selector" ).menu({
blur: function( event, ui ) {}
});

Bind an event listener to the menublur event:

1
                                    
$( ".selector" ).on( "menublur", function( event, ui ) {} );

create( event, ui )Type: menucreate

Triggered when the menu is created.
Code examples:

Initialize the menu with the create callback specified:

1
2
3
                                    
$( ".selector" ).menu({
create: function( event, ui ) {}
});

Bind an event listener to the menucreate event:

1
                                    
$( ".selector" ).on( "menucreate", function( event, ui ) {} );

focus( event, ui )Type: menufocus

Triggered when a menu gains focus or when any menu item is activated.
  • event
    Type: Event
  • ui
    Type: Object
    • item
      Type: jQuery
      The currently active menu item.
Code examples:

Initialize the menu with the focus callback specified:

1
2
3
                                    
$( ".selector" ).menu({
focus: function( event, ui ) {}
});

Bind an event listener to the menufocus event:

1
                                    
$( ".selector" ).on( "menufocus", function( event, ui ) {} );

select( event, ui )Type: menuselect

Triggered when a menu item is selected.
  • event
    Type: Event
  • ui
    Type: Object
    • item
      Type: jQuery
      The currently active menu item.
Code examples:

Initialize the menu with the select callback specified:

1
2
3
                                    
$( ".selector" ).menu({
select: function( event, ui ) {}
});

Bind an event listener to the menuselect event:

1
                                    
$( ".selector" ).on( "menuselect", function( event, ui ) {} );

Example:

A simple jQuery UI Menu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
                                  
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>menu demo</title>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.1/themes/base/jquery-ui.css">
<style>
.ui-menu {
width: 200px;
}
</style>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.1/jquery-ui.js"></script>
</head>
<body>
<ul id="menu">
<li><a href="#">Item 1</a></li>
<li><a href="#">Item 2</a></li>
<li><a href="#">Item 3</a>
<ul>
<li><a href="#">Item 3-1</a></li>
<li><a href="#">Item 3-2</a></li>
<li><a href="#">Item 3-3</a></li>
<li><a href="#">Item 3-4</a></li>
<li><a href="#">Item 3-5</a></li>
</ul>
</li>
<li><a href="#">Item 4</a></li>
<li><a href="#">Item 5</a></li>
</ul>
<script>
$( "#menu" ).menu();
</script>
</body>
</html>