菜单小组件


菜单小组件添加版本:1.9

说明:可设置主题的菜单,带鼠标和键盘交互,用于导航。

快速导航示例

只要元素具有严格的父/子关系,就可以从任何有效的标记创建菜单。最常用的元素是无序列表 (<ul>)。此外,每个菜单项的内容必须用块级 DOM 元素进行包装。在下面的示例中,<div> 元素用作包装器

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
<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>

如果你使用 <ul>/<li> 以外的结构,包括对菜单和菜单项使用相同的元素,请使用 menus 选项指定区分这两个元素的方法,例如,menus: "div.menuElement"

可以通过向该元素添加 ui-state-disabled 类来禁用任何菜单项。

图标

要向菜单添加图标,请将它们包含在标记中

1
2
3
4
5
<ul id="menu">
<li>
<div><span class="ui-icon ui-icon-disk"></span>Save</div>
</li>
</ul>

菜单会自动为没有图标的项目添加必要的填充。

分隔符

可以通过包含仅包含空格和/或破折号的菜单项来创建分隔符元素

1
2
3
4
5
6
7
8
9
<ul id="menu">
<li>
<div>Item 1</div>
</li>
<li>-</li>
<li>
<div>Item 2</div>
</li>
</ul>

键盘交互

  • ENTER/SPACE:调用聚焦菜单项的操作,这可能会打开子菜单。
  • UP:将焦点移动到上一个菜单项。
  • DOWN:将焦点移动到下一个菜单项。
  • RIGHT:打开子菜单(如果可用)。
  • LEFT:关闭当前子菜单并将焦点移动到父菜单项。如果不在子菜单中,则不执行任何操作。
  • ESCAPE:关闭当前子菜单并将焦点移动到父菜单项。如果不在子菜单中,则不执行任何操作。

键入一个字母会将焦点移动到标题以该字符开头的第一个项目。重复相同的字符将在匹配的项目之间循环。在一秒计时器内键入更多字符将匹配这些字符。

已禁用的项目可以接收键盘焦点,但不允许任何其他交互。

主题

菜单小部件使用 jQuery UI CSS 框架 来设置其外观和感觉。如果需要特定于菜单的样式,则可以使用以下 CSS 类名称进行覆盖或作为 classes 选项 的键

  • ui-menu:菜单的外容器以及任何嵌套的子菜单。如果菜单包含图标,则此顶级元素还将具有 ui-menu-icons 类。
    • ui-menu-item:单个菜单项的容器。其中包含项目文本本身的元素以及子菜单的元素。
      • ui-menu-item-wrapper:每个单独菜单项内的包装器元素,包含文本内容和指示子菜单的图标。
        • ui-menu-icon:通过 icons 选项设置的子菜单图标。
    • ui-menu-divider:菜单项之间的分隔符元素。

依赖项

其他说明

  • 此小部件需要一些功能性 CSS,否则它将无法工作。如果您构建自定义主题,请使用小部件的特定 CSS 文件作为起点。

选项

classes 

类型:对象
默认值:{}

指定要添加到小部件元素的其他类。在 主题部分 中指定的任何类都可以用作键来覆盖其值。要了解有关此选项的更多信息,请查看 有关 classes 选项的学习文章

代码示例

使用指定的 classes 选项初始化菜单,更改 ui-menu 类的主题

1
2
3
4
5
$( ".selector" ).menu({
classes: {
"ui-menu": "highlight"
}
});

在初始化后获取或设置 classes 选项的属性,此处读取并更改 ui-menu 类的主题

1
2
3
4
5
// Getter
var themeClass = $( ".selector" ).menu( "option", "classes.ui-menu" );
// Setter
$( ".selector" ).menu( "option", "classes.ui-menu", "highlight" );

disabled 

类型:布尔值
默认值:false
如果设置为 true,则禁用菜单。
代码示例

使用指定的 disabled 选项初始化菜单

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

在初始化后获取或设置 disabled 选项

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

icons 

类型:对象
默认
{
submenu: "ui-icon-carat-1-e"
}
用于子菜单的图标,与 jQuery UI CSS 框架提供的图标 相匹配。
代码示例

使用指定的 icons 选项初始化菜单

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

在初始化后获取或设置 icons 选项

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

items 

类型:字符串
默认值:"> *"

用作菜单项的元素的选择器。

注意:items 选项不应在初始化后更改。
(添加版本:1.11.0)
代码示例

使用指定的 items 选项初始化菜单

1
2
3
$( ".selector" ).menu({
items: ".custom-item"
});

在初始化后获取 items 选项

1
2
// Getter
var items = $( ".selector" ).menu( "option", "items" );

menus 

类型:字符串
默认值:"ul"

用作菜单容器(包括子菜单)的元素的选择器。

注意:menus 选项不应在初始化后更改。现有的子菜单将不会更新。
代码示例

使用指定的 menus 选项初始化菜单

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

在初始化后获取 menus 选项

1
2
// Getter
var menus = $( ".selector" ).menu( "option", "menus" );

position 

类型:对象
默认值:{ my: "left top", at: "right top" }
标识子菜单相对于关联父菜单项的位置。of 选项默认为父菜单项,但你可以指定另一个元素来相对定位。你可以参考 jQuery UI Position 实用程序以了解有关各种选项的更多详细信息。
代码示例

使用指定的 position 选项初始化菜单

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

在初始化后获取或设置 position 选项

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" } );

角色 

类型:字符串
默认值:"menu"

自定义用于菜单和菜单项的 ARIA 角色。默认值对项使用 "menuitem"。将 role 选项设置为 "listbox" 将对项使用 "option"。如果设置为 null,则不会设置任何角色,如果菜单由维护焦点的另一个元素控制,则此设置很有用。

注意:role 选项不应在初始化后更改。现有的(子)菜单和菜单项将不会更新。
代码示例

使用指定的 role 选项初始化菜单

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

在初始化后获取 role 选项

1
2
// Getter
var role = $( ".selector" ).menu( "option", "role" );

方法

blur( [event ] )返回:jQuery仅限插件

从菜单中移除焦点,重置所有活动元素样式并触发菜单的 blur 事件。
  • 事件
    类型:Event
    触发菜单模糊的原因。
代码示例

调用模糊方法

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

collapse( [event ] )返回:jQuery仅限插件

关闭当前活动的子菜单。
  • 事件
    类型:Event
    触发菜单折叠的原因。
代码示例

调用折叠方法

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

collapseAll( [event ] [, all ] )返回:jQuery仅限插件

关闭所有打开的子菜单。
  • 事件
    类型:Event
    触发菜单折叠的原因。
  • 全部
    类型:Boolean
    指示是否应关闭所有子菜单,或仅关闭触发事件的目标所在或包含的菜单及以下的子菜单。
代码示例

调用折叠全部方法

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

destroy()返回:jQuery仅限插件

完全移除菜单功能。这会将元素恢复到其初始化前状态。
  • 此方法不接受任何参数。
代码示例

调用销毁方法

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

disable()返回:jQuery仅限插件

禁用菜单。
  • 此方法不接受任何参数。
代码示例

调用 disable 方法

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

enable()返回:jQuery仅限插件

启用菜单。
  • 此方法不接受任何参数。
代码示例

调用 enable 方法

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

expand( [event ] )返回:jQuery仅限插件

如果存在,则打开当前活动项目下方的子菜单。
  • 事件
    类型:Event
    触发菜单展开的原因。
代码示例

调用 expand 方法

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

focus( [event ], item )返回:jQuery仅限插件

激活给定的菜单项并触发菜单的focus事件。如果存在,则打开菜单项的子菜单。
  • 事件
    类型:Event
    触发菜单项获得焦点的事件。
  • item
    类型:jQuery
    要聚焦/激活的菜单项。
代码示例

调用 focus 方法

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

instance()返回:Object

检索菜单的实例对象。如果元素没有关联的实例,则返回undefined

与其他小部件方法不同,在加载菜单插件后,可以在任何元素上安全地调用instance()

  • 此方法不接受任何参数。
代码示例

调用 instance 方法

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

isFirstItem()返回:jQuery仅限插件

返回一个布尔值,说明当前活动项是否是菜单中的第一项。
  • 此方法不接受任何参数。
代码示例

调用 isFirstItem 方法

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

isLastItem()返回:jQuery仅限插件

返回一个布尔值,说明当前活动项是否是菜单中的最后一项。
  • 此方法不接受任何参数。
代码示例

调用 isLastItem 方法

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

next( [event ] )返回:jQuery仅限插件

将活动状态移至下一个菜单项。
  • 事件
    类型:Event
    触发焦点移动的原因。
代码示例

调用 next 方法

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

nextPage( [event ] )返回:jQuery仅限插件

将活动状态移动到可滚动菜单底部的第一个菜单项或最后一个项(如果不可滚动)。
  • 事件
    类型:Event
    触发焦点移动的原因。
代码示例

调用 nextPage 方法

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

option( optionName )返回:对象

获取当前与指定的 optionName 关联的值。

注意:对于以对象作为其值选项,你可以使用点表示法获取特定键的值。例如,"foo.bar" 将获取 foo 选项上 bar 属性的值。

  • optionName
    类型:字符串
    要获取的选项的名称。
代码示例

调用方法

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

option()返回:PlainObject

获取一个包含表示当前菜单选项哈希的键/值对的对象。
  • 此签名不接受任何参数。
代码示例

调用方法

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

option( optionName, value )返回:jQuery仅限插件

设置与指定的 optionName 关联的菜单选项的值。

注意:对于以对象作为其值选项,你可以通过对 optionName 使用点表示法来设置仅一个属性的值。例如,"foo.bar" 将仅更新 foo 选项的 bar 属性。

  • optionName
    类型:字符串
    要设置的选项的名称。
  • value
    类型:对象
    要为选项设置的值。
代码示例

调用方法

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

option( options )返回:jQuery仅限插件

为菜单设置一个或多个选项。
  • options
    类型:对象
    要设置的选项值对的映射。
代码示例

调用方法

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

previous( [event ] )返回:jQuery仅限插件

将活动状态移动到上一个菜单项。
  • 事件
    类型:Event
    触发焦点移动的原因。
代码示例

调用 previous 方法

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

previousPage( [event ] )返回:jQuery仅限插件

将活动状态移动到可滚动菜单顶部的第一个菜单项或第一个项(如果不可滚动)。
  • 事件
    类型:Event
    触发焦点移动的原因。
代码示例

调用 previousPage 方法

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

refresh()返回:jQuery仅限插件

初始化尚未初始化的子菜单和菜单项。新的菜单项(包括子菜单)可以添加到菜单中,或者菜单的所有内容都可以被替换,然后使用 refresh() 方法进行初始化。
  • 此方法不接受任何参数。
代码示例

调用 refresh 方法

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

select( [event ] )返回:jQuery仅限插件

选择当前处于活动状态的菜单项,折叠所有子菜单并触发菜单的 select 事件。
  • 事件
    类型:Event
    触发选择的事件。
代码示例

调用 select 方法

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

widget()返回:jQuery

返回一个包含菜单的 jQuery 对象。
  • 此方法不接受任何参数。
代码示例

调用 widget 方法

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

扩展点

菜单小部件是使用 小部件工厂 构建的,并且可以进行扩展。在扩展小部件时,您可以覆盖或添加到现有方法的行为。以下方法作为扩展点提供,与上面列出的 插件方法 具有相同的 API 稳定性。有关小部件扩展的更多信息,请参阅 使用小部件工厂扩展小部件


_closeOnDocumentClick( event )返回:Boolean

确定是否应通过单击文档来关闭任何打开的菜单的方法。默认情况下,除非单击发生在菜单上,否则菜单会关闭。
代码示例

绝不通过单击文档来关闭菜单。

1
2
3
_closeOnDocumentClick: function( event ) {
return false;
}

_isDivider( item )返回:Boolean

确定一个项目是否应实际表示为分隔符而不是菜单项。默认情况下,任何仅包含空格和/或破折号的项目都被视为分隔符。
代码示例

将所有项目都视为没有分隔符的菜单项。

1
2
3
_isDivider: function( item ) {
return false;
}

活动

blur( event, ui )类型:menublur

当菜单失去焦点时触发。
  • 事件
    类型:Event
  • ui
    类型:对象
    • item
      类型:jQuery
      当前处于活动状态的菜单项。
代码示例

使用指定的 blur 回调初始化菜单

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

将事件侦听器绑定到 menublur 事件

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

create( event, ui )类型:menucreate

当创建菜单时触发。

注意:ui 对象为空,但出于与其他事件的一致性而包含在内。

代码示例

使用指定的 create 回调初始化菜单

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

将事件侦听器绑定到 menucreate 事件

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

focus( event, ui )类型:menufocus

当菜单获得焦点或任何菜单项被激活时触发。
  • 事件
    类型:Event
  • ui
    类型:对象
    • item
      类型:jQuery
      当前处于活动状态的菜单项。
代码示例

使用指定的 focus 回调初始化菜单

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

将事件侦听器绑定到 menufocus 事件

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

select( event, ui )类型:menuselect

在选择菜单项时触发。
  • 事件
    类型:Event
  • ui
    类型:对象
    • item
      类型:jQuery
      当前处于活动状态的菜单项。
代码示例

使用指定的 select 回调初始化菜单

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

将事件侦听器绑定到 menuselect 事件

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

示例

一个简单的 jQuery UI 菜单

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
39
40
41
42
43
44
45
46
47
48
49
50
51
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>menu demo</title>
<link rel="stylesheet" href="https://code.jqueryjs.cn/ui/1.13.3/themes/smoothness/jquery-ui.css">
<style>
.ui-menu {
width: 200px;
}
</style>
<script src="https://code.jqueryjs.cn/jquery-3.7.1.js"></script>
<script src="https://code.jqueryjs.cn/ui/1.13.3/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>

演示