Menu Widgetversion added: 1.9
Description: Themeable menu with mouse and keyboard interactions for navigation.
A menu can be created from any valid markup as long as the elements have a strict parent/child relationship. The most commonly used element is the unordered list (<ul>
). Additionally, the contents of each menu item must be wrapped with a block-level DOM element. In the example below <div>
elements are used as wrappers:
<ul id="menu"> <li> <div>Item 1</div> </li> <li> <div>Item 2</div> </li> <li> <div>Item 3</div> <ul> <li> <div>Item 3-1</div> </li> <li> <div>Item 3-2</div> </li> <li> <div>Item 3-3</div> </li> </ul> </li> <li> <div>Item 4</div> </li> <li> <div>Item 5</div> </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.
Icons
To add icons to the menu, include them in the markup:
<ul id="menu"> <li> <div><span class="ui-icon ui-icon-disk"></span>Save</div> </li> </ul>
Menu automatically adds the necessary padding to items without icons.
Dividers
Divider elements can be created by including menu items that contain only spaces and/or dashes:
<ul id="menu"> <li> <div>Item 1</div> </li> <li>-</li> <li> <div>Item 2</div> </li> </ul>
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.
Theming
The menu widget uses the jQuery UI CSS framework to style its look and feel. If menu specific styling is needed, the following CSS class names can be used for overrides or as keys for the classes
option:
-
ui-menu
: The outer container of the menu, as well as any nested submenu. This top-level element will additionally have aui-menu-icons
class if the menu contains icons.-
ui-menu-item
: The container for individual menu items. This contains the element for the item's text itself as well as the element for submenus.-
ui-menu-item-wrapper
: The wrapper element inside each individual menu item, containting the text content and the icon indicating submenus.-
ui-menu-icon
: The submenu icons set via theicons
option.
-
-
-
ui-menu-divider
: Divider elements between menu items.
-
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
classes
{}
Specify additional classes to add to the widget's elements. Any of classes specified in the Theming section can be used as keys to override their value. To learn more about this option, check out the learn article about the classes
option.
Initialize the menu with the classes
option specified, changing the theming for the ui-menu
class:
$( ".selector" ).menu({ classes: { "ui-menu": "highlight" } });
Get or set a property of the classes
option, after initialization, here reading and changing the theming for the ui-menu
class:
// Getter var themeClass = $( ".selector" ).menu( "option", "classes.ui-menu" ); // Setter $( ".selector" ).menu( "option", "classes.ui-menu", "highlight" );
disabled
false
true
.Initialize the menu with the disabled
option specified:
$( ".selector" ).menu({ disabled: true });
Get or set the disabled
option, after initialization:
// Getter var disabled = $( ".selector" ).menu( "option", "disabled" ); // Setter $( ".selector" ).menu( "option", "disabled", true );
icons
{ submenu: "ui-icon-carat-1-e" }
Initialize the menu with the icons
option specified:
$( ".selector" ).menu({ icons: { submenu: "ui-icon-circle-triangle-e" } });
Get or set the icons
option, after initialization:
// Getter var icons = $( ".selector" ).menu( "option", "icons" ); // Setter $( ".selector" ).menu( "option", "icons", { submenu: "ui-icon-circle-triangle-e" } );
items
"> *"
Selector for the elements that serve as the menu items.
items
option should not be changed after initialization.Initialize the menu with the items
option specified:
$( ".selector" ).menu({ items: ".custom-item" });
Get the items
option, after initialization:
// Getter var items = $( ".selector" ).menu( "option", "items" );
position
{ my: "left top", at: "right top" }
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.Initialize the menu with the position
option specified:
$( ".selector" ).menu({ position: { my: "left top", at: "right-5 top+5" } });
Get or set the position
option, after initialization:
// Getter var position = $( ".selector" ).menu( "option", "position" ); // Setter $( ".selector" ).menu( "option", "position", { my: "left top", at: "right-5 top+5" } );
role
"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.
role
option should not be changed after initialization. Existing (sub)menus and menu items will not be updated.Initialize the menu with the role
option specified:
$( ".selector" ).menu({ role: null });
Get the role
option, after initialization:
// Getter var role = $( ".selector" ).menu( "option", "role" );
Methods
blur( [event ] )Returns: jQuery (plugin only)
blur
event. - eventType: EventWhat triggered the menu to blur.
Invoke the blur method:
$( ".selector" ).menu( "blur" );
collapse( [event ] )Returns: jQuery (plugin only)
- eventType: EventWhat triggered the menu to collapse.
Invoke the collapse method:
$( ".selector" ).menu( "collapse" );
collapseAll( [event ] [, all ] )Returns: jQuery (plugin only)
- eventType: EventWhat triggered the menu to collapse.
- allType: BooleanIndicates 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.
Invoke the collapseAll method:
$( ".selector" ).menu( "collapseAll", null, true );
destroy()Returns: jQuery (plugin only)
- This method does not accept any arguments.
Invoke the destroy method:
$( ".selector" ).menu( "destroy" );
disable()Returns: jQuery (plugin only)
- This method does not accept any arguments.
Invoke the disable method:
$( ".selector" ).menu( "disable" );
enable()Returns: jQuery (plugin only)
- This method does not accept any arguments.
Invoke the enable method:
$( ".selector" ).menu( "enable" );
expand( [event ] )Returns: jQuery (plugin only)
- eventType: EventWhat triggered the menu to expand.
Invoke the expand method:
$( ".selector" ).menu( "expand" );
focus( [event ], item )Returns: jQuery (plugin only)
focus
event. Opens the menu item's sub-menu, if one exists. - eventType: EventWhat triggered the menu item to gain focus.
- itemType: jQueryThe menu item to focus/activate.
Invoke the focus method:
$( ".selector" ).menu( "focus", null, menu.find( ".ui-menu-item:last" ) );
instance()Returns: Object
Retrieves the menu's instance object. If the element does not have an associated instance, undefined
is returned.
Unlike other widget methods, instance()
is safe to call on any element after the menu plugin has loaded.
- This method does not accept any arguments.
Invoke the instance method:
$( ".selector" ).menu( "instance" );
isFirstItem()Returns: jQuery (plugin only)
- This method does not accept any arguments.
Invoke the isFirstItem method:
var firstItem = $( ".selector" ).menu( "isFirstItem" );
isLastItem()Returns: jQuery (plugin only)
- This method does not accept any arguments.
Invoke the isLastItem method:
var lastItem = $( ".selector" ).menu( "isLastItem" );
next( [event ] )Returns: jQuery (plugin only)
- eventType: EventWhat triggered the focus to move.
Invoke the next method:
$( ".selector" ).menu( "next" );
nextPage( [event ] )Returns: jQuery (plugin only)
- eventType: EventWhat triggered the focus to move.
Invoke the nextPage method:
$( ".selector" ).menu( "nextPage" );
option( optionName )Returns: Object
Gets the value currently associated with the specified optionName
.
Note: For options that have objects as their value, you can get the value of a specific key by using dot notation. For example, "foo.bar"
would get the value of the bar
property on the foo
option.
- optionNameType: StringThe name of the option to get.
Invoke the method:
var isDisabled = $( ".selector" ).menu( "option", "disabled" );
option()Returns: PlainObject
- This signature does not accept any arguments.
Invoke the method:
var options = $( ".selector" ).menu( "option" );
option( optionName, value )Returns: jQuery (plugin only)
Sets the value of the menu option associated with the specified optionName
.
Note: For options that have objects as their value, you can set the value of just one property by using dot notation for optionName
. For example, "foo.bar"
would update only the bar
property of the foo
option.
- optionNameType: StringThe name of the option to set.
- valueType: ObjectA value to set for the option.
Invoke the method:
$( ".selector" ).menu( "option", "disabled", true );
option( options )Returns: jQuery (plugin only)
- optionsType: ObjectA map of option-value pairs to set.
Invoke the method:
$( ".selector" ).menu( "option", { disabled: true } );
previous( [event ] )Returns: jQuery (plugin only)
- eventType: EventWhat triggered the focus to move.
Invoke the previous method:
$( ".selector" ).menu( "previous" );
previousPage( [event ] )Returns: jQuery (plugin only)
- eventType: EventWhat triggered the focus to move.
Invoke the previousPage method:
$( ".selector" ).menu( "previousPage" );
refresh()Returns: jQuery (plugin only)
refresh()
method. - This method does not accept any arguments.
Invoke the refresh method:
$( ".selector" ).menu( "refresh" );
select( [event ] )Returns: jQuery (plugin only)
select
event. - eventType: EventWhat triggered the selection.
Invoke the select method:
$( ".selector" ).menu( "select" );
widget()Returns: jQuery
jQuery
object containing the menu. - This method does not accept any arguments.
Invoke the widget method:
var widget = $( ".selector" ).menu( "widget" );
Extension Points
The menu widget is built with the widget factory and can be extended. When extending widgets, you have the ability to override or add to the behavior of existing methods. The following methods are provided as extension points with the same API stability as the plugin methods listed above. For more information on widget extensions, see Extending Widgets with the Widget Factory.
_closeOnDocumentClick( event )Returns: Boolean
- eventType: Event
Never close menus on document click.
_closeOnDocumentClick: function( event ) { return false; }
_isDivider( item )Returns: Boolean
- itemType: jQuery
Treat all items as menu items with no dividers.
_isDivider: function( item ) { return false; }
Events
blur( event, ui )Type: menublur
Initialize the menu with the blur callback specified:
$( ".selector" ).menu({ blur: function( event, ui ) {} });
Bind an event listener to the menublur event:
$( ".selector" ).on( "menublur", function( event, ui ) {} );
create( event, ui )Type: menucreate
Note: The ui
object is empty but included for consistency with other events.
Initialize the menu with the create callback specified:
$( ".selector" ).menu({ create: function( event, ui ) {} });
Bind an event listener to the menucreate event:
$( ".selector" ).on( "menucreate", function( event, ui ) {} );
focus( event, ui )Type: menufocus
Initialize the menu with the focus callback specified:
$( ".selector" ).menu({ focus: function( event, ui ) {} });
Bind an event listener to the menufocus event:
$( ".selector" ).on( "menufocus", function( event, ui ) {} );
select( event, ui )Type: menuselect
Initialize the menu with the select callback specified:
$( ".selector" ).menu({ select: function( event, ui ) {} });
Bind an event listener to the menuselect event:
$( ".selector" ).on( "menuselect", function( event, ui ) {} );
Example:
A simple jQuery UI Menu
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>menu demo</title> <link rel="stylesheet" href="//code.jquery.com/ui/1.12.0/themes/smoothness/jquery-ui.css"> <style> .ui-menu { width: 200px; } </style> <script src="//code.jquery.com/jquery-1.12.4.js"></script> <script src="//code.jquery.com/ui/1.12.0/jquery-ui.js"></script> </head> <body> <ul id="menu"> <li> <div>Item 1</div> </li> <li> <div>Item 2</div> </li> <li> <div>Item 3</div> <ul> <li> <div>Item 3-1</div> </li> <li> <div>Item 3-2</div> </li> <li> <div>Item 3-3</div> </li> </ul> </li> <li> <div>Item 4</div> </li> <li> <div>Item 5</div> </li> </ul> <script> $( "#menu" ).menu(); </script> </body> </html>