简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français

站内搜索

搜索

活动公告

11-02 12:46
10-23 09:32
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,将及时处理!
10-23 09:31
10-23 09:28
通知:签到时间调整为每日4:00(东八区)
10-23 09:26

jQuery EasyUI水平菜单使用方法从入门到精通详细讲解配置选项事件处理动态菜单创建响应式设计以及项目实战中的技巧与注意事项

3万

主题

349

科技点

3万

积分

大区版主

木柜子打湿

积分
31898

三倍冰淇淋无人之境【一阶】财Doro小樱(小丑装)立华奏以外的星空【二阶】⑨的冰沙

发表于 2025-9-18 02:40:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. jQuery EasyUI简介

jQuery EasyUI是一个基于jQuery的用户界面插件集合,它为网页开发者提供了丰富的UI组件,如数据网格、树形菜单、面板、标签页等。这些组件可以帮助开发者快速构建功能丰富、界面美观的Web应用程序。EasyUI的主要特点是易于使用、轻量级且跨浏览器兼容。

在众多组件中,菜单组件是Web应用中常见的导航元素,而水平菜单则是其中一种重要的表现形式。水平菜单通常用于网站顶部导航栏,能够清晰地展示网站的主要功能模块,提供直观的用户导航体验。

2. 水平菜单基础入门

基本概念

jQuery EasyUI的水平菜单是通过<div>元素结合特定的HTML结构和EasyUI的API来创建的。菜单项可以包含文本、图标,并且可以支持子菜单,形成多级菜单结构。

简单示例

下面是一个最基本的jQuery EasyUI水平菜单示例:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>jQuery EasyUI 水平菜单示例</title>
  6.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">
  7.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/icon.css">
  8.     <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
  9.     <script type="text/javascript" src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
  10. </head>
  11. <body>
  12.     <div id="mm" class="easyui-menu" style="width:120px;">
  13.         <div>New</div>
  14.         <div>
  15.             <span>Open</span>
  16.             <div style="width:150px;">
  17.                 <div>Word</div>
  18.                 <div>Excel</div>
  19.                 <div>PowerPoint</div>
  20.             </div>
  21.         </div>
  22.         <div data-options="iconCls:'icon-save'">Save</div>
  23.         <div class="menu-sep"></div>
  24.         <div>Exit</div>
  25.     </div>
  26.    
  27.     <div style="margin:20px 0;">
  28.         <a href="#" class="easyui-linkbutton" onclick="$('#mm').menu('show', {left: 0, top: 0})">Show Menu</a>
  29.     </div>
  30. </body>
  31. </html>
复制代码

必要的HTML结构

要创建一个水平菜单,我们需要以下基本的HTML结构:
  1. <div id="menu" class="easyui-menu" data-options="mode:'horizontal'">
  2.     <div data-options="name:'item1', iconCls:'icon-edit'">菜单项1</div>
  3.     <div data-options="name:'item2'">
  4.         <span>菜单项2</span>
  5.         <div>
  6.             <div data-options="name:'subitem1'">子菜单项1</div>
  7.             <div data-options="name:'subitem2'">子菜单项2</div>
  8.         </div>
  9.     </div>
  10.     <div data-options="name:'item3', iconCls:'icon-help'">菜单项3</div>
  11. </div>
复制代码

关键点说明:

• 最外层div需要添加class="easyui-menu"来标识这是一个EasyUI菜单组件。
• data-options="mode:'horizontal'"指定菜单为水平模式。
• 每个菜单项使用div元素表示。
• 子菜单通过嵌套div结构实现。
• data-options属性用于配置菜单项的各种选项,如名称、图标等。

3. 配置选项详解

常用配置项

jQuery EasyUI水平菜单提供了丰富的配置选项,下面是一些常用的配置项:

1.
  1. mode:菜单模式,可以是’horizontal’(水平)或’vertical’(垂直)。$('#menu').menu({
  2.    mode: 'horizontal'
  3. });
复制代码
2.
  1. zIndex:菜单的z-index值,用于控制菜单的堆叠顺序。$('#menu').menu({
  2.    zIndex: 110000
  3. });
复制代码
3.
  1. left:菜单的左侧位置。$('#menu').menu({
  2.    left: 100
  3. });
复制代码
4.
  1. top:菜单的顶部位置。$('#menu').menu({
  2.    top: 100
  3. });
复制代码
5.
  1. minWidth:菜单的最小宽度。$('#menu').menu({
  2.    minWidth: 150
  3. });
复制代码
6.
  1. hideOnUnhover:当鼠标离开菜单时是否自动隐藏菜单,默认为true。$('#menu').menu({
  2.    hideOnUnhover: false
  3. });
复制代码
7.
  1. duration:定义动画持续时间,以毫秒为单位。$('#menu').menu({
  2.    duration: 200
  3. });
复制代码

mode:菜单模式,可以是’horizontal’(水平)或’vertical’(垂直)。
  1. $('#menu').menu({
  2.    mode: 'horizontal'
  3. });
复制代码

zIndex:菜单的z-index值,用于控制菜单的堆叠顺序。
  1. $('#menu').menu({
  2.    zIndex: 110000
  3. });
复制代码

left:菜单的左侧位置。
  1. $('#menu').menu({
  2.    left: 100
  3. });
复制代码

top:菜单的顶部位置。
  1. $('#menu').menu({
  2.    top: 100
  3. });
复制代码

minWidth:菜单的最小宽度。
  1. $('#menu').menu({
  2.    minWidth: 150
  3. });
复制代码

hideOnUnhover:当鼠标离开菜单时是否自动隐藏菜单,默认为true。
  1. $('#menu').menu({
  2.    hideOnUnhover: false
  3. });
复制代码

duration:定义动画持续时间,以毫秒为单位。
  1. $('#menu').menu({
  2.    duration: 200
  3. });
复制代码

高级配置项

除了基本配置项外,jQuery EasyUI还提供了一些高级配置选项,用于更精细地控制菜单的行为:

1.
  1. align:菜单的对齐方式,可以是’left’或’right’。$('#menu').menu({
  2.    align: 'right'
  3. });
复制代码
2.
  1. itemHeight:菜单项的高度。$('#menu').menu({
  2.    itemHeight: 30
  3. });
复制代码
3.
  1. noline:是否隐藏菜单项之间的分隔线,默认为false。$('#menu').menu({
  2.    noline: true
  3. });
复制代码
4.
  1. disabled:是否禁用菜单,默认为false。$('#menu').menu({
  2.    disabled: true
  3. });
复制代码

align:菜单的对齐方式,可以是’left’或’right’。
  1. $('#menu').menu({
  2.    align: 'right'
  3. });
复制代码

itemHeight:菜单项的高度。
  1. $('#menu').menu({
  2.    itemHeight: 30
  3. });
复制代码

noline:是否隐藏菜单项之间的分隔线,默认为false。
  1. $('#menu').menu({
  2.    noline: true
  3. });
复制代码

disabled:是否禁用菜单,默认为false。
  1. $('#menu').menu({
  2.    disabled: true
  3. });
复制代码

配置示例

下面是一个综合使用多种配置选项的示例:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>jQuery EasyUI 水平菜单配置示例</title>
  6.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">
  7.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/icon.css">
  8.     <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
  9.     <script type="text/javascript" src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
  10.     <style>
  11.         body {
  12.             padding: 20px;
  13.         }
  14.     </style>
  15. </head>
  16. <body>
  17.     <h2>jQuery EasyUI 水平菜单配置示例</h2>
  18.    
  19.     <div id="mm" style="width:100%;"></div>
  20.    
  21.     <div style="margin:20px 0;">
  22.         <a href="#" class="easyui-linkbutton" onclick="showMenu()">显示菜单</a>
  23.     </div>
  24.    
  25.     <script>
  26.         $(function(){
  27.             $('#mm').menu({
  28.                 mode: 'horizontal',
  29.                 itemHeight: 35,
  30.                 duration: 300,
  31.                 noline: false,
  32.                 data: [{
  33.                     text: '文件',
  34.                     iconCls: 'icon-file',
  35.                     children: [{
  36.                         text: '新建',
  37.                         iconCls: 'icon-add',
  38.                         onclick: function(){alert('新建文件');}
  39.                     },{
  40.                         text: '打开',
  41.                         iconCls: 'icon-open',
  42.                         children: [{
  43.                             text: 'Word文档',
  44.                             onclick: function(){alert('打开Word文档');}
  45.                         },{
  46.                             text: 'Excel表格',
  47.                             onclick: function(){alert('打开Excel表格');}
  48.                         }]
  49.                     },{
  50.                         text: '保存',
  51.                         iconCls: 'icon-save',
  52.                         disabled: true
  53.                     }]
  54.                 },{
  55.                     text: '编辑',
  56.                     iconCls: 'icon-edit',
  57.                     children: [{
  58.                         text: '撤销',
  59.                         iconCls: 'icon-undo'
  60.                     },{
  61.                         text: '重做',
  62.                         iconCls: 'icon-redo'
  63.                     }]
  64.                 },{
  65.                     text: '帮助',
  66.                     iconCls: 'icon-help',
  67.                     onclick: function(){alert('帮助信息');}
  68.                 }]
  69.             });
  70.         });
  71.         
  72.         function showMenu(){
  73.             $('#mm').menu('show', {
  74.                 left: 0,
  75.                 top: 50
  76.             });
  77.         }
  78.     </script>
  79. </body>
  80. </html>
复制代码

4. 事件处理

常用事件

jQuery EasyUI水平菜单提供了多种事件,用于响应用户的交互行为:

1.
  1. onShow:当菜单显示时触发。$('#menu').menu({
  2.    onShow: function(){
  3.        console.log('菜单已显示');
  4.    }
  5. });
复制代码
2.
  1. onHide:当菜单隐藏时触发。$('#menu').menu({
  2.    onHide: function(){
  3.        console.log('菜单已隐藏');
  4.    }
  5. });
复制代码
3.
  1. onClick:当点击菜单项时触发。$('#menu').menu({
  2.    onClick: function(item){
  3.        console.log('点击了菜单项: ' + item.text);
  4.    }
  5. });
复制代码

onShow:当菜单显示时触发。
  1. $('#menu').menu({
  2.    onShow: function(){
  3.        console.log('菜单已显示');
  4.    }
  5. });
复制代码

onHide:当菜单隐藏时触发。
  1. $('#menu').menu({
  2.    onHide: function(){
  3.        console.log('菜单已隐藏');
  4.    }
  5. });
复制代码

onClick:当点击菜单项时触发。
  1. $('#menu').menu({
  2.    onClick: function(item){
  3.        console.log('点击了菜单项: ' + item.text);
  4.    }
  5. });
复制代码

事件绑定方法

除了在初始化菜单时直接配置事件处理函数外,还可以使用以下方法绑定事件:

1.
  1. 使用bind方法:$('#menu').bind('click', function(event, item){
  2.    console.log('点击了菜单项: ' + item.text);
  3. });
复制代码
2.
  1. 使用on方法(推荐):$('#menu').on('click', function(event, item){
  2.    console.log('点击了菜单项: ' + item.text);
  3. });
复制代码

使用bind方法:
  1. $('#menu').bind('click', function(event, item){
  2.    console.log('点击了菜单项: ' + item.text);
  3. });
复制代码

使用on方法(推荐):
  1. $('#menu').on('click', function(event, item){
  2.    console.log('点击了菜单项: ' + item.text);
  3. });
复制代码

事件处理示例

下面是一个综合使用多种事件的示例:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>jQuery EasyUI 水平菜单事件处理示例</title>
  6.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">
  7.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/icon.css">
  8.     <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
  9.     <script type="text/javascript" src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
  10.     <style>
  11.         body {
  12.             padding: 20px;
  13.         }
  14.         #log {
  15.             margin-top: 20px;
  16.             padding: 10px;
  17.             border: 1px solid #ccc;
  18.             height: 200px;
  19.             overflow-y: auto;
  20.         }
  21.     </style>
  22. </head>
  23. <body>
  24.     <h2>jQuery EasyUI 水平菜单事件处理示例</h2>
  25.    
  26.     <div id="mm" class="easyui-menu" style="width:100%;" data-options="mode:'horizontal'">
  27.         <div data-options="name:'file', iconCls:'icon-file'">
  28.             <span>文件</span>
  29.             <div style="width:150px;">
  30.                 <div data-options="name:'new', iconCls:'icon-add'">新建</div>
  31.                 <div data-options="name:'open', iconCls:'icon-open'">打开</div>
  32.                 <div data-options="name:'save', iconCls:'icon-save'">保存</div>
  33.                 <div class="menu-sep"></div>
  34.                 <div data-options="name:'exit'">退出</div>
  35.             </div>
  36.         </div>
  37.         <div data-options="name:'edit', iconCls:'icon-edit'">
  38.             <span>编辑</span>
  39.             <div style="width:150px;">
  40.                 <div data-options="name:'undo', iconCls:'icon-undo'">撤销</div>
  41.                 <div data-options="name:'redo', iconCls:'icon-redo'">重做</div>
  42.                 <div class="menu-sep"></div>
  43.                 <div data-options="name:'cut', iconCls:'icon-cut'">剪切</div>
  44.                 <div data-options="name:'copy', iconCls:'icon-copy'">复制</div>
  45.                 <div data-options="name:'paste', iconCls:'icon-paste'">粘贴</div>
  46.             </div>
  47.         </div>
  48.         <div data-options="name:'help', iconCls:'icon-help'">帮助</div>
  49.     </div>
  50.    
  51.     <div style="margin:20px 0;">
  52.         <a href="#" class="easyui-linkbutton" onclick="showMenu()">显示菜单</a>
  53.         <a href="#" class="easyui-linkbutton" onclick="clearLog()">清除日志</a>
  54.     </div>
  55.    
  56.     <div id="log"></div>
  57.    
  58.     <script>
  59.         $(function(){
  60.             // 初始化菜单事件
  61.             $('#mm').menu({
  62.                 onShow: function(){
  63.                     log('菜单已显示');
  64.                 },
  65.                 onHide: function(){
  66.                     log('菜单已隐藏');
  67.                 },
  68.                 onClick: function(item){
  69.                     log('点击了菜单项: ' + item.text + ' (name: ' + item.name + ')');
  70.                 }
  71.             });
  72.             
  73.             // 为特定菜单项添加事件处理
  74.             $('#mm').menu('setItem', {
  75.                 target: $('#mm').menu('findItem', '新建').target,
  76.                 onclick: function(){
  77.                     log('执行新建操作');
  78.                 }
  79.             });
  80.             
  81.             $('#mm').menu('setItem', {
  82.                 target: $('#mm').menu('findItem', '打开').target,
  83.                 onclick: function(){
  84.                     log('执行打开操作');
  85.                 }
  86.             });
  87.             
  88.             $('#mm').menu('setItem', {
  89.                 target: $('#mm').menu('findItem', '保存').target,
  90.                 onclick: function(){
  91.                     log('执行保存操作');
  92.                 }
  93.             });
  94.             
  95.             $('#mm').menu('setItem', {
  96.                 target: $('#mm').menu('findItem', '退出').target,
  97.                 onclick: function(){
  98.                     log('执行退出操作');
  99.                 }
  100.             });
  101.         });
  102.         
  103.         function showMenu(){
  104.             $('#mm').menu('show', {
  105.                 left: 0,
  106.                 top: 50
  107.             });
  108.         }
  109.         
  110.         function log(message){
  111.             var $log = $('#log');
  112.             var time = new Date().toLocaleTimeString();
  113.             $log.append('<div>[' + time + '] ' + message + '</div>');
  114.             $log.scrollTop($log[0].scrollHeight);
  115.         }
  116.         
  117.         function clearLog(){
  118.             $('#log').empty();
  119.         }
  120.     </script>
  121. </body>
  122. </html>
复制代码

5. 动态菜单创建

动态添加菜单项

在实际应用中,我们经常需要根据用户权限或系统状态动态添加菜单项。jQuery EasyUI提供了多种方法来实现这一功能:

1.
  1. 使用appendItem方法:// 添加一个新的菜单项
  2. $('#menu').menu('appendItem', {
  3.    text: '新菜单项',
  4.    iconCls: 'icon-add',
  5.    onclick: function(){
  6.        alert('点击了新菜单项');
  7.    }
  8. });
复制代码
2.
  1. 使用insertItem方法:// 在指定位置插入一个新的菜单项
  2. $('#menu').menu('insertItem', {
  3.    item: {
  4.        text: '插入的菜单项',
  5.        iconCls: 'icon-edit',
  6.        onclick: function(){
  7.            alert('点击了插入的菜单项');
  8.        }
  9.    },
  10.    index: 1  // 插入到第二个位置
  11. });
复制代码

使用appendItem方法:
  1. // 添加一个新的菜单项
  2. $('#menu').menu('appendItem', {
  3.    text: '新菜单项',
  4.    iconCls: 'icon-add',
  5.    onclick: function(){
  6.        alert('点击了新菜单项');
  7.    }
  8. });
复制代码

使用insertItem方法:
  1. // 在指定位置插入一个新的菜单项
  2. $('#menu').menu('insertItem', {
  3.    item: {
  4.        text: '插入的菜单项',
  5.        iconCls: 'icon-edit',
  6.        onclick: function(){
  7.            alert('点击了插入的菜单项');
  8.        }
  9.    },
  10.    index: 1  // 插入到第二个位置
  11. });
复制代码

动态修改菜单

我们也可以动态修改现有的菜单项:

1.
  1. 使用setItem方法:// 修改指定的菜单项
  2. $('#menu').menu('setItem', {
  3.    target: $('#menu').menu('findItem', '旧菜单项').target,
  4.    text: '新菜单项',
  5.    iconCls: 'icon-save',
  6.    disabled: false
  7. });
复制代码
2.
  1. 使用enableItem和disableItem方法:
  2. “`javascript
  3. // 启用菜单项\(('#menu').menu('enableItem', \)(‘#menu’).menu(‘findItem’, ‘禁用菜单项’).target);
复制代码

使用setItem方法:
  1. // 修改指定的菜单项
  2. $('#menu').menu('setItem', {
  3.    target: $('#menu').menu('findItem', '旧菜单项').target,
  4.    text: '新菜单项',
  5.    iconCls: 'icon-save',
  6.    disabled: false
  7. });
复制代码

使用enableItem和disableItem方法:
“`javascript
// 启用菜单项\(('#menu').menu('enableItem', \)(‘#menu’).menu(‘findItem’, ‘禁用菜单项’).target);

// 禁用菜单项\(('#menu').menu('disableItem', \)(‘#menu’).menu(‘findItem’, ‘启用菜单项’).target);
  1. ### 动态删除菜单项
  2. 删除菜单项同样简单:
  3. 1. **使用removeItem方法**:
  4.    ```javascript
  5.    // 删除指定的菜单项
  6.    var item = $('#menu').menu('findItem', '要删除的菜单项');
  7.    if (item){
  8.        $('#menu').menu('removeItem', item.target);
  9.    }
复制代码

动态菜单示例

下面是一个综合展示动态菜单操作的示例:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>jQuery EasyUI 动态菜单示例</title>
  6.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">
  7.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/icon.css">
  8.     <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
  9.     <script type="text/javascript" src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
  10.     <style>
  11.         body {
  12.             padding: 20px;
  13.         }
  14.         .operation-panel {
  15.             margin: 20px 0;
  16.             padding: 10px;
  17.             border: 1px solid #ccc;
  18.             background-color: #f5f5f5;
  19.         }
  20.         .operation-panel .easyui-linkbutton {
  21.             margin-right: 10px;
  22.             margin-bottom: 5px;
  23.         }
  24.         #log {
  25.             margin-top: 20px;
  26.             padding: 10px;
  27.             border: 1px solid #ccc;
  28.             height: 200px;
  29.             overflow-y: auto;
  30.         }
  31.     </style>
  32. </head>
  33. <body>
  34.     <h2>jQuery EasyUI 动态菜单示例</h2>
  35.    
  36.     <div id="mm" class="easyui-menu" style="width:100%;" data-options="mode:'horizontal'">
  37.         <div data-options="name:'file', iconCls:'icon-file'">
  38.             <span>文件</span>
  39.             <div style="width:150px;">
  40.                 <div data-options="name:'new', iconCls:'icon-add'">新建</div>
  41.                 <div data-options="name:'open', iconCls:'icon-open'">打开</div>
  42.                 <div data-options="name:'save', iconCls:'icon-save'">保存</div>
  43.             </div>
  44.         </div>
  45.         <div data-options="name:'edit', iconCls:'icon-edit'">
  46.             <span>编辑</span>
  47.             <div style="width:150px;">
  48.                 <div data-options="name:'undo', iconCls:'icon-undo'">撤销</div>
  49.                 <div data-options="name:'redo', iconCls:'icon-redo'">重做</div>
  50.             </div>
  51.         </div>
  52.     </div>
  53.    
  54.     <div class="operation-panel">
  55.         <h3>菜单操作</h3>
  56.         <a href="#" class="easyui-linkbutton" onclick="showMenu()">显示菜单</a>
  57.         <a href="#" class="easyui-linkbutton" onclick="hideMenu()">隐藏菜单</a>
  58.         <a href="#" class="easyui-linkbutton" onclick="appendMenuItem()">添加菜单项</a>
  59.         <a href="#" class="easyui-linkbutton" onclick="insertMenuItem()">插入菜单项</a>
  60.         <a href="#" class="easyui-linkbutton" onclick="updateMenuItem()">修改菜单项</a>
  61.         <a href="#" class="easyui-linkbutton" onclick="removeMenuItem()">删除菜单项</a>
  62.         <a href="#" class="easyui-linkbutton" onclick="enableMenuItem()">启用菜单项</a>
  63.         <a href="#" class="easyui-linkbutton" onclick="disableMenuItem()">禁用菜单项</a>
  64.         <a href="#" class="easyui-linkbutton" onclick="clearLog()">清除日志</a>
  65.     </div>
  66.    
  67.     <div id="log"></div>
  68.    
  69.     <script>
  70.         $(function(){
  71.             // 初始化菜单事件
  72.             $('#mm').menu({
  73.                 onShow: function(){
  74.                     log('菜单已显示');
  75.                 },
  76.                 onHide: function(){
  77.                     log('菜单已隐藏');
  78.                 },
  79.                 onClick: function(item){
  80.                     log('点击了菜单项: ' + item.text + ' (name: ' + item.name + ')');
  81.                 }
  82.             });
  83.         });
  84.         
  85.         function showMenu(){
  86.             $('#mm').menu('show', {
  87.                 left: 0,
  88.                 top: 50
  89.             });
  90.         }
  91.         
  92.         function hideMenu(){
  93.             $('#mm').menu('hide');
  94.         }
  95.         
  96.         function appendMenuItem(){
  97.             var itemName = '动态添加' + new Date().getTime();
  98.             $('#mm').menu('appendItem', {
  99.                 text: itemName,
  100.                 iconCls: 'icon-add',
  101.                 name: itemName,
  102.                 onclick: function(){
  103.                     log('执行动态添加的菜单项操作: ' + itemName);
  104.                 }
  105.             });
  106.             log('已添加菜单项: ' + itemName);
  107.         }
  108.         
  109.         function insertMenuItem(){
  110.             var itemName = '动态插入' + new Date().getTime();
  111.             $('#mm').menu('insertItem', {
  112.                 item: {
  113.                     text: itemName,
  114.                     iconCls: 'icon-edit',
  115.                     name: itemName,
  116.                     onclick: function(){
  117.                         log('执行动态插入的菜单项操作: ' + itemName);
  118.                     }
  119.                 },
  120.                 index: 1  // 插入到第二个位置
  121.             });
  122.             log('已插入菜单项: ' + itemName);
  123.         }
  124.         
  125.         function updateMenuItem(){
  126.             var item = $('#mm').menu('findItem', '新建');
  127.             if (item){
  128.                 $('#mm').menu('setItem', {
  129.                     target: item.target,
  130.                     text: '新建文件',
  131.                     iconCls: 'icon-fileadd'
  132.                 });
  133.                 log('已修改菜单项: 新建 -> 新建文件');
  134.             } else {
  135.                 log('未找到要修改的菜单项');
  136.             }
  137.         }
  138.         
  139.         function removeMenuItem(){
  140.             var item = $('#mm').menu('findItem', '重做');
  141.             if (item){
  142.                 $('#mm').menu('removeItem', item.target);
  143.                 log('已删除菜单项: 重做');
  144.             } else {
  145.                 log('未找到要删除的菜单项');
  146.             }
  147.         }
  148.         
  149.         function enableMenuItem(){
  150.             var item = $('#mm').menu('findItem', '保存');
  151.             if (item){
  152.                 $('#mm').menu('enableItem', item.target);
  153.                 log('已启用菜单项: 保存');
  154.             } else {
  155.                 log('未找到要启用的菜单项');
  156.             }
  157.         }
  158.         
  159.         function disableMenuItem(){
  160.             var item = $('#mm').menu('findItem', '保存');
  161.             if (item){
  162.                 $('#mm').menu('disableItem', item.target);
  163.                 log('已禁用菜单项: 保存');
  164.             } else {
  165.                 log('未找到要禁用的菜单项');
  166.             }
  167.         }
  168.         
  169.         function log(message){
  170.             var $log = $('#log');
  171.             var time = new Date().toLocaleTimeString();
  172.             $log.append('<div>[' + time + '] ' + message + '</div>');
  173.             $log.scrollTop($log[0].scrollHeight);
  174.         }
  175.         
  176.         function clearLog(){
  177.             $('#log').empty();
  178.         }
  179.     </script>
  180. </body>
  181. </html>
复制代码

6. 响应式设计

响应式菜单的概念

响应式设计是指网页能够根据不同的设备屏幕大小自动调整布局和功能,以提供最佳的用户体验。对于水平菜单而言,响应式设计意味着在桌面设备上显示为完整的水平菜单,而在移动设备上可能会转换为汉堡菜单或其他更适合小屏幕的形式。

实现方法

实现jQuery EasyUI水平菜单的响应式设计,可以采用以下几种方法:

1.
  1. 使用CSS媒体查询:
  2. “`css
  3. /* 桌面设备样式 */
  4. @media (min-width: 768px) {
  5.    #menu {
  6.        display: block;
  7.    }
  8.    #hamburger-menu {
  9.        display: none;
  10.    }
  11. }
复制代码

/* 移动设备样式 */
   @media (max-width: 767px) {
  1. #menu {
  2.        display: none;
  3.    }
  4.    #hamburger-menu {
  5.        display: block;
  6.    }
复制代码

}
  1. 2. **使用JavaScript检测屏幕宽度**:
  2.    ```javascript
  3.    $(window).resize(function() {
  4.        if ($(window).width() < 768) {
  5.            // 移动设备逻辑
  6.            $('#menu').hide();
  7.            $('#hamburger-menu').show();
  8.        } else {
  9.            // 桌面设备逻辑
  10.            $('#menu').show();
  11.            $('#hamburger-menu').hide();
  12.        }
  13.    });
复制代码

1.
  1. 使用EasyUI的响应式插件:$('#menu').menu({
  2.    responsive: true,
  3.    breakpoint: 768,
  4.    mobileMenu: $('#hamburger-menu')
  5. });
复制代码
  1. $('#menu').menu({
  2.    responsive: true,
  3.    breakpoint: 768,
  4.    mobileMenu: $('#hamburger-menu')
  5. });
复制代码

响应式菜单示例

下面是一个完整的响应式菜单示例:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>jQuery EasyUI 响应式水平菜单示例</title>
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">
  8.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/icon.css">
  9.     <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
  10.     <script type="text/javascript" src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
  11.     <style>
  12.         body {
  13.             padding: 0;
  14.             margin: 0;
  15.             font-family: Arial, sans-serif;
  16.         }
  17.         .header {
  18.             background-color: #f5f5f5;
  19.             padding: 10px;
  20.             position: relative;
  21.         }
  22.         .logo {
  23.             display: inline-block;
  24.             vertical-align: middle;
  25.             margin-right: 20px;
  26.         }
  27.         .menu-container {
  28.             display: inline-block;
  29.             vertical-align: middle;
  30.             width: calc(100% - 120px);
  31.         }
  32.         .hamburger {
  33.             display: none;
  34.             float: right;
  35.             cursor: pointer;
  36.             padding: 5px;
  37.         }
  38.         .content {
  39.             padding: 20px;
  40.         }
  41.         
  42.         /* 桌面设备样式 */
  43.         @media (min-width: 768px) {
  44.             #horizontal-menu {
  45.                 display: block;
  46.             }
  47.             #vertical-menu {
  48.                 display: none;
  49.             }
  50.             .hamburger {
  51.                 display: none;
  52.             }
  53.         }
  54.         
  55.         /* 移动设备样式 */
  56.         @media (max-width: 767px) {
  57.             #horizontal-menu {
  58.                 display: none;
  59.             }
  60.             #vertical-menu {
  61.                 display: none;
  62.                 position: absolute;
  63.                 top: 100%;
  64.                 left: 0;
  65.                 right: 0;
  66.                 z-index: 1000;
  67.                 background-color: #fff;
  68.                 border: 1px solid #ddd;
  69.             }
  70.             .hamburger {
  71.                 display: block;
  72.             }
  73.         }
  74.     </style>
  75. </head>
  76. <body>
  77.     <div class="header">
  78.         <div class="logo">
  79.             <img src="https://www.jeasyui.com/images/logo.png" alt="Logo" height="30">
  80.         </div>
  81.         <div class="menu-container">
  82.             <div id="horizontal-menu" class="easyui-menu" style="width:100%;" data-options="mode:'horizontal'">
  83.                 <div data-options="name:'home', iconCls:'icon-house'">
  84.                     <span>首页</span>
  85.                 </div>
  86.                 <div data-options="name:'products', iconCls:'icon-ok'">
  87.                     <span>产品</span>
  88.                     <div style="width:150px;">
  89.                         <div data-options="name:'product1'">产品1</div>
  90.                         <div data-options="name:'product2'">产品2</div>
  91.                         <div data-options="name:'product3'">产品3</div>
  92.                     </div>
  93.                 </div>
  94.                 <div data-options="name:'services', iconCls:'icon-tip'">
  95.                     <span>服务</span>
  96.                     <div style="width:150px;">
  97.                         <div data-options="name:'service1'">服务1</div>
  98.                         <div data-options="name:'service2'">服务2</div>
  99.                     </div>
  100.                 </div>
  101.                 <div data-options="name:'about', iconCls:'icon-search'">
  102.                     <span>关于我们</span>
  103.                 </div>
  104.                 <div data-options="name:'contact', iconCls:'icon-man'">
  105.                     <span>联系我们</span>
  106.                 </div>
  107.             </div>
  108.             
  109.             <div id="vertical-menu" class="easyui-menu" style="width:150px;">
  110.                 <div data-options="name:'home', iconCls:'icon-house'">
  111.                     <span>首页</span>
  112.                 </div>
  113.                 <div data-options="name:'products', iconCls:'icon-ok'">
  114.                     <span>产品</span>
  115.                     <div>
  116.                         <div data-options="name:'product1'">产品1</div>
  117.                         <div data-options="name:'product2'">产品2</div>
  118.                         <div data-options="name:'product3'">产品3</div>
  119.                     </div>
  120.                 </div>
  121.                 <div data-options="name:'services', iconCls:'icon-tip'">
  122.                     <span>服务</span>
  123.                     <div>
  124.                         <div data-options="name:'service1'">服务1</div>
  125.                         <div data-options="name:'service2'">服务2</div>
  126.                     </div>
  127.                 </div>
  128.                 <div data-options="name:'about', iconCls:'icon-search'">
  129.                     <span>关于我们</span>
  130.                 </div>
  131.                 <div data-options="name:'contact', iconCls:'icon-man'">
  132.                     <span>联系我们</span>
  133.                 </div>
  134.             </div>
  135.             
  136.             <div class="hamburger" onclick="toggleMobileMenu()">
  137.                 <span class="easyui-linkbutton" data-options="iconCls:'icon-menu'"></span>
  138.             </div>
  139.         </div>
  140.     </div>
  141.    
  142.     <div class="content">
  143.         <h2>响应式菜单示例</h2>
  144.         <p>调整浏览器窗口大小,查看菜单在不同屏幕尺寸下的表现。</p>
  145.         <p>在桌面设备上,菜单显示为水平菜单;在移动设备上,菜单转换为汉堡菜单。</p>
  146.     </div>
  147.    
  148.     <script>
  149.         $(function(){
  150.             // 初始化菜单事件
  151.             $('#horizontal-menu, #vertical-menu').menu({
  152.                 onClick: function(item){
  153.                     alert('点击了菜单项: ' + item.text);
  154.                 }
  155.             });
  156.             
  157.             // 监听窗口大小变化
  158.             $(window).resize(function() {
  159.                 if ($(window).width() < 768) {
  160.                     // 移动设备
  161.                     $('#horizontal-menu').hide();
  162.                     $('#vertical-menu').hide();
  163.                 } else {
  164.                     // 桌面设备
  165.                     $('#horizontal-menu').show();
  166.                     $('#vertical-menu').hide();
  167.                 }
  168.             });
  169.         });
  170.         
  171.         function toggleMobileMenu() {
  172.             $('#vertical-menu').toggle();
  173.             if ($('#vertical-menu').is(':visible')) {
  174.                 $('#vertical-menu').menu('show', {
  175.                     left: 0,
  176.                     top: $('.header').height()
  177.                 });
  178.             }
  179.         }
  180.     </script>
  181. </body>
  182. </html>
复制代码

7. 项目实战技巧与注意事项

性能优化

在实际项目中,为了提高菜单的性能和用户体验,可以考虑以下优化技巧:

1.
  1. 延迟加载子菜单:
  2. “`javascript
  3. $(‘#menu’).menu({
  4.    onShow: function(){
  5.        // 只有在显示菜单时才加载子菜单数据
  6.        loadSubMenuData();
  7.    }
  8. });
复制代码

function loadSubMenuData() {
  1. // 使用AJAX加载子菜单数据
  2.    $.ajax({
  3.        url: '/api/submenu',
  4.        type: 'GET',
  5.        success: function(data) {
  6.            // 处理返回的数据并更新菜单
  7.            updateMenuWithNewData(data);
  8.        }
  9.    });
复制代码

}
  1. 2. **菜单项缓存**:
  2.    ```javascript
  3.    // 缓存菜单项,避免重复查询DOM
  4.    var menuItemsCache = {};
  5.    
  6.    function getMenuItem(name) {
  7.        if (!menuItemsCache[name]) {
  8.            menuItemsCache[name] = $('#menu').menu('findItem', name);
  9.        }
  10.        return menuItemsCache[name];
  11.    }
复制代码

1.
  1. 使用事件委托:// 使用事件委托而不是为每个菜单项单独绑定事件
  2. $('#menu').on('click', '.menu-item', function() {
  3.    var itemName = $(this).data('name');
  4.    handleMenuItemClick(itemName);
  5. });
复制代码
  1. // 使用事件委托而不是为每个菜单项单独绑定事件
  2. $('#menu').on('click', '.menu-item', function() {
  3.    var itemName = $(this).data('name');
  4.    handleMenuItemClick(itemName);
  5. });
复制代码

常见问题及解决方案

1. 菜单在移动设备上显示不正常:问题:在移动设备上,水平菜单可能会超出屏幕宽度或显示不完整。解决方案:实现响应式设计,在小屏幕上将水平菜单转换为汉堡菜单或垂直菜单。
2. 问题:在移动设备上,水平菜单可能会超出屏幕宽度或显示不完整。
3. 解决方案:实现响应式设计,在小屏幕上将水平菜单转换为汉堡菜单或垂直菜单。
4.
  1. 子菜单被其他元素遮挡:问题:子菜单可能被页面上的其他元素遮挡,导致无法正常显示或点击。解决方案:增加菜单的z-index值,确保菜单显示在最上层。$('#menu').menu({
  2. zIndex: 9999
  3. });
复制代码
5. 问题:子菜单可能被页面上的其他元素遮挡,导致无法正常显示或点击。
6.
  1. 解决方案:增加菜单的z-index值,确保菜单显示在最上层。$('#menu').menu({
  2. zIndex: 9999
  3. });
复制代码
7.
  1. 菜单项点击事件不触发:问题:点击菜单项时,绑定的点击事件没有触发。解决方案:检查菜单项是否被禁用,或者事件绑定是否正确。
  2. “`javascript
  3. // 确保菜单项未被禁用
  4. $(‘#menu’).menu(‘enableItem’, item.target);// 正确绑定点击事件
  5. $(‘#menu’).menu({onClick: function(item) {
  6.      // 处理点击事件
  7. }});
  8. “`
复制代码
8. 问题:点击菜单项时,绑定的点击事件没有触发。
9.
  1. 解决方案:检查菜单项是否被禁用,或者事件绑定是否正确。
  2. “`javascript
  3. // 确保菜单项未被禁用
  4. $(‘#menu’).menu(‘enableItem’, item.target);
复制代码
10.
  1. 动态添加的菜单项样式不正确:问题:动态添加的菜单项可能没有应用正确的样式。解决方案:在添加菜单项后,调用EasyUI的解析方法。$('#menu').menu('appendItem', {
  2. text: '新菜单项'
  3. });
  4. $.parser.parse('#menu');  // 重新解析菜单
复制代码
11. 问题:动态添加的菜单项可能没有应用正确的样式。
12.
  1. 解决方案:在添加菜单项后,调用EasyUI的解析方法。$('#menu').menu('appendItem', {
  2. text: '新菜单项'
  3. });
  4. $.parser.parse('#menu');  // 重新解析菜单
复制代码

菜单在移动设备上显示不正常:

• 问题:在移动设备上,水平菜单可能会超出屏幕宽度或显示不完整。
• 解决方案:实现响应式设计,在小屏幕上将水平菜单转换为汉堡菜单或垂直菜单。

子菜单被其他元素遮挡:

• 问题:子菜单可能被页面上的其他元素遮挡,导致无法正常显示或点击。
  1. 解决方案:增加菜单的z-index值,确保菜单显示在最上层。$('#menu').menu({
  2. zIndex: 9999
  3. });
复制代码
  1. $('#menu').menu({
  2. zIndex: 9999
  3. });
复制代码

菜单项点击事件不触发:

• 问题:点击菜单项时,绑定的点击事件没有触发。
  1. 解决方案:检查菜单项是否被禁用,或者事件绑定是否正确。
  2. “`javascript
  3. // 确保菜单项未被禁用
  4. $(‘#menu’).menu(‘enableItem’, item.target);
复制代码

// 正确绑定点击事件
$(‘#menu’).menu({
  1. onClick: function(item) {
  2.      // 处理点击事件
  3. }
复制代码

});
“`

动态添加的菜单项样式不正确:

• 问题:动态添加的菜单项可能没有应用正确的样式。
  1. 解决方案:在添加菜单项后,调用EasyUI的解析方法。$('#menu').menu('appendItem', {
  2. text: '新菜单项'
  3. });
  4. $.parser.parse('#menu');  // 重新解析菜单
复制代码
  1. $('#menu').menu('appendItem', {
  2. text: '新菜单项'
  3. });
  4. $.parser.parse('#menu');  // 重新解析菜单
复制代码

最佳实践

1.
  1. 使用语义化的HTML结构:<nav id="main-menu" class="easyui-menu" data-options="mode:'horizontal'">
  2.    <div data-options="name:'home'">首页</div>
  3.    <div data-options="name:'products'">产品</div>
  4.    <div data-options="name:'services'">服务</div>
  5.    <div data-options="name:'about'">关于我们</div>
  6. </nav>
复制代码
2.
  1. 分离数据和视图:
  2. “`javascript
  3. // 从服务器获取菜单数据
  4. $.ajax({
  5.    url: ‘/api/menu’,
  6.    type: ‘GET’,
  7.    success: function(data) {// 使用数据渲染菜单
  8.    renderMenu(data);}
  9. });
复制代码

使用语义化的HTML结构:
  1. <nav id="main-menu" class="easyui-menu" data-options="mode:'horizontal'">
  2.    <div data-options="name:'home'">首页</div>
  3.    <div data-options="name:'products'">产品</div>
  4.    <div data-options="name:'services'">服务</div>
  5.    <div data-options="name:'about'">关于我们</div>
  6. </nav>
复制代码

分离数据和视图:
“`javascript
// 从服务器获取菜单数据
$.ajax({
   url: ‘/api/menu’,
   type: ‘GET’,
   success: function(data) {
  1. // 使用数据渲染菜单
  2.    renderMenu(data);
复制代码

}
});

function renderMenu(menuData) {
  1. $('#menu').menu({
  2.        data: menuData
  3.    });
复制代码

}
  1. 3. **使用命名空间避免冲突**:
  2.    ```javascript
  3.    // 使用命名空间
  4.    var MyApp = MyApp || {};
  5.    MyApp.Menu = {
  6.        init: function() {
  7.            this.bindEvents();
  8.        },
  9.        bindEvents: function() {
  10.            $('#menu').menu({
  11.                onClick: this.handleItemClick
  12.            });
  13.        },
  14.        handleItemClick: function(item) {
  15.            // 处理菜单项点击
  16.        }
  17.    };
  18.    
  19.    // 初始化菜单
  20.    $(function() {
  21.        MyApp.Menu.init();
  22.    });
复制代码

1.
  1. 提供键盘导航支持:
  2. “`javascript\((document).keydown(function(e) {
  3.    if (\)(‘#menu’).is(‘:visible’)) {
  4.        switch(e.keyCode) {
  5.            case 27: // ESC键
  6.                $(‘#menu’).menu(‘hide’);
  7.                break;
  8.            case 37: // 左箭头
  9.                navigateMenu(‘left’);
  10.                break;
  11.            case 38: // 上箭头
  12.                navigateMenu(‘up’);
  13.                break;
  14.            case 39: // 右箭头
  15.                navigateMenu(‘right’);
  16.                break;
  17.            case 40: // 下箭头
  18.                navigateMenu(‘down’);
  19.                break;
  20.        }
  21.    }
  22. });
复制代码

function navigateMenu(direction) {
  1. // 实现菜单导航逻辑
复制代码

}
  1. 5. **添加适当的动画效果**:
  2.    ```javascript
  3.    $('#menu').menu({
  4.        duration: 200,  // 设置动画持续时间
  5.        onShow: function() {
  6.            $(this).fadeIn(200);
  7.        },
  8.        onHide: function() {
  9.            $(this).fadeOut(200);
  10.        }
  11.    });
复制代码

项目实战示例

下面是一个综合运用上述技巧和最佳实践的项目实战示例:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>jQuery EasyUI 水平菜单项目实战示例</title>
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">
  8.     <link rel="stylesheet" type="text/css" href="https://www.jeasyui.com/easyui/themes/icon.css">
  9.     <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
  10.     <script type="text/javascript" src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
  11.     <style>
  12.         body {
  13.             padding: 0;
  14.             margin: 0;
  15.             font-family: Arial, sans-serif;
  16.         }
  17.         .header {
  18.             background-color: #f5f5f5;
  19.             padding: 10px;
  20.             position: relative;
  21.             box-shadow: 0 2px 5px rgba(0,0,0,0.1);
  22.         }
  23.         .logo {
  24.             display: inline-block;
  25.             vertical-align: middle;
  26.             margin-right: 20px;
  27.         }
  28.         .menu-container {
  29.             display: inline-block;
  30.             vertical-align: middle;
  31.             width: calc(100% - 120px);
  32.         }
  33.         .hamburger {
  34.             display: none;
  35.             float: right;
  36.             cursor: pointer;
  37.             padding: 5px;
  38.         }
  39.         .content {
  40.             padding: 20px;
  41.         }
  42.         .status-bar {
  43.             position: fixed;
  44.             bottom: 0;
  45.             left: 0;
  46.             right: 0;
  47.             background-color: #f5f5f5;
  48.             padding: 5px 10px;
  49.             border-top: 1px solid #ddd;
  50.             font-size: 12px;
  51.             color: #666;
  52.         }
  53.         
  54.         /* 桌面设备样式 */
  55.         @media (min-width: 768px) {
  56.             #horizontal-menu {
  57.                 display: block;
  58.             }
  59.             #vertical-menu {
  60.                 display: none;
  61.             }
  62.             .hamburger {
  63.                 display: none;
  64.             }
  65.         }
  66.         
  67.         /* 移动设备样式 */
  68.         @media (max-width: 767px) {
  69.             #horizontal-menu {
  70.                 display: none;
  71.             }
  72.             #vertical-menu {
  73.                 display: none;
  74.                 position: absolute;
  75.                 top: 100%;
  76.                 left: 0;
  77.                 right: 0;
  78.                 z-index: 1000;
  79.                 background-color: #fff;
  80.                 border: 1px solid #ddd;
  81.                 box-shadow: 0 2px 5px rgba(0,0,0,0.1);
  82.             }
  83.             .hamburger {
  84.                 display: block;
  85.             }
  86.         }
  87.         
  88.         /* 自定义菜单样式 */
  89.         .custom-menu .menu-text {
  90.             padding-left: 5px;
  91.         }
  92.         .custom-menu .menu-icon {
  93.             width: 20px;
  94.             height: 20px;
  95.             display: inline-block;
  96.             vertical-align: middle;
  97.             margin-right: 5px;
  98.         }
  99.     </style>
  100. </head>
  101. <body>
  102.     <div class="header">
  103.         <div class="logo">
  104.             <img src="https://www.jeasyui.com/images/logo.png" alt="Logo" height="30">
  105.         </div>
  106.         <div class="menu-container">
  107.             <div id="horizontal-menu" class="easyui-menu custom-menu" style="width:100%;" data-options="mode:'horizontal'"></div>
  108.             
  109.             <div id="vertical-menu" class="easyui-menu custom-menu" style="width:150px;"></div>
  110.             
  111.             <div class="hamburger" onclick="toggleMobileMenu()">
  112.                 <span class="easyui-linkbutton" data-options="iconCls:'icon-menu'"></span>
  113.             </div>
  114.         </div>
  115.     </div>
  116.    
  117.     <div class="content">
  118.         <h2>项目实战示例</h2>
  119.         <p>这是一个综合运用jQuery EasyUI水平菜单各种特性的项目实战示例。</p>
  120.         <p>特点:</p>
  121.         <ul>
  122.             <li>响应式设计,适配不同屏幕尺寸</li>
  123.             <li>动态加载菜单数据</li>
  124.             <li>键盘导航支持</li>
  125.             <li>性能优化</li>
  126.             <li>最佳实践应用</li>
  127.         </ul>
  128.         
  129.         <h3>操作说明</h3>
  130.         <p>1. 点击菜单项查看响应</p>
  131.         <p>2. 调整浏览器窗口大小,查看响应式效果</p>
  132.         <p>3. 在移动设备模式下,点击汉堡菜单显示垂直菜单</p>
  133.         <p>4. 使用键盘方向键和ESC键进行菜单导航</p>
  134.     </div>
  135.    
  136.     <div class="status-bar" id="status-bar">
  137.         就绪
  138.     </div>
  139.    
  140.     <script>
  141.         // 使用命名空间
  142.         var MyApp = MyApp || {};
  143.         MyApp.Menu = {
  144.             // 菜单数据
  145.             menuData: [
  146.                 {
  147.                     text: '首页',
  148.                     name: 'home',
  149.                     iconCls: 'icon-house'
  150.                 },
  151.                 {
  152.                     text: '产品',
  153.                     name: 'products',
  154.                     iconCls: 'icon-ok',
  155.                     children: [
  156.                         {
  157.                             text: '产品1',
  158.                             name: 'product1'
  159.                         },
  160.                         {
  161.                             text: '产品2',
  162.                             name: 'product2'
  163.                         },
  164.                         {
  165.                             text: '产品3',
  166.                             name: 'product3'
  167.                         }
  168.                     ]
  169.                 },
  170.                 {
  171.                     text: '服务',
  172.                     name: 'services',
  173.                     iconCls: 'icon-tip',
  174.                     children: [
  175.                         {
  176.                             text: '服务1',
  177.                             name: 'service1'
  178.                         },
  179.                         {
  180.                             text: '服务2',
  181.                             name: 'service2'
  182.                         }
  183.                     ]
  184.                 },
  185.                 {
  186.                     text: '关于我们',
  187.                     name: 'about',
  188.                     iconCls: 'icon-search'
  189.                 },
  190.                 {
  191.                     text: '联系我们',
  192.                     name: 'contact',
  193.                     iconCls: 'icon-man'
  194.                 }
  195.             ],
  196.             
  197.             // 菜单项缓存
  198.             menuItemsCache: {},
  199.             
  200.             // 初始化
  201.             init: function() {
  202.                 this.renderMenus();
  203.                 this.bindEvents();
  204.                 this.setupKeyboardNavigation();
  205.                 this.updateStatus('菜单初始化完成');
  206.             },
  207.             
  208.             // 渲染菜单
  209.             renderMenus: function() {
  210.                 // 渲染水平菜单
  211.                 $('#horizontal-menu').menu({
  212.                     data: this.menuData,
  213.                     duration: 200,
  214.                     onClick: this.handleItemClick,
  215.                     onShow: function() {
  216.                         MyApp.Menu.updateStatus('菜单已显示');
  217.                     },
  218.                     onHide: function() {
  219.                         MyApp.Menu.updateStatus('菜单已隐藏');
  220.                     }
  221.                 });
  222.                
  223.                 // 渲染垂直菜单
  224.                 $('#vertical-menu').menu({
  225.                     data: this.menuData,
  226.                     duration: 200,
  227.                     onClick: this.handleItemClick,
  228.                     onShow: function() {
  229.                         MyApp.Menu.updateStatus('移动菜单已显示');
  230.                     },
  231.                     onHide: function() {
  232.                         MyApp.Menu.updateStatus('移动菜单已隐藏');
  233.                     }
  234.                 });
  235.             },
  236.             
  237.             // 绑定事件
  238.             bindEvents: function() {
  239.                 // 监听窗口大小变化
  240.                 $(window).resize(this.handleResize);
  241.                
  242.                 // 初始调整
  243.                 this.handleResize();
  244.             },
  245.             
  246.             // 设置键盘导航
  247.             setupKeyboardNavigation: function() {
  248.                 $(document).keydown(function(e) {
  249.                     var $menu = $('#horizontal-menu').is(':visible') ? $('#horizontal-menu') : $('#vertical-menu');
  250.                     
  251.                     if ($menu.is(':visible')) {
  252.                         switch(e.keyCode) {
  253.                             case 27: // ESC键
  254.                                 $menu.menu('hide');
  255.                                 MyApp.Menu.updateStatus('菜单已关闭');
  256.                                 break;
  257.                             case 37: // 左箭头
  258.                                 MyApp.Menu.navigateMenu('left');
  259.                                 break;
  260.                             case 38: // 上箭头
  261.                                 MyApp.Menu.navigateMenu('up');
  262.                                 break;
  263.                             case 39: // 右箭头
  264.                                 MyApp.Menu.navigateMenu('right');
  265.                                 break;
  266.                             case 40: // 下箭头
  267.                                 MyApp.Menu.navigateMenu('down');
  268.                                 break;
  269.                         }
  270.                     }
  271.                 });
  272.             },
  273.             
  274.             // 菜单导航
  275.             navigateMenu: function(direction) {
  276.                 this.updateStatus('菜单导航: ' + direction);
  277.                 // 实际项目中,这里应该实现具体的导航逻辑
  278.             },
  279.             
  280.             // 处理窗口大小变化
  281.             handleResize: function() {
  282.                 if ($(window).width() < 768) {
  283.                     // 移动设备
  284.                     $('#horizontal-menu').hide();
  285.                     $('#vertical-menu').hide();
  286.                     MyApp.Menu.updateStatus('切换到移动设备模式');
  287.                 } else {
  288.                     // 桌面设备
  289.                     $('#horizontal-menu').show();
  290.                     $('#vertical-menu').hide();
  291.                     MyApp.Menu.updateStatus('切换到桌面设备模式');
  292.                 }
  293.             },
  294.             
  295.             // 处理菜单项点击
  296.             handleItemClick: function(item) {
  297.                 MyApp.Menu.updateStatus('点击了菜单项: ' + item.text + ' (name: ' + item.name + ')');
  298.                 // 实际项目中,这里应该根据点击的菜单项执行相应的操作
  299.             },
  300.             
  301.             // 获取菜单项(带缓存)
  302.             getMenuItem: function(name) {
  303.                 if (!this.menuItemsCache[name]) {
  304.                     var item = $('#horizontal-menu').menu('findItem', name);
  305.                     if (!item) {
  306.                         item = $('#vertical-menu').menu('findItem', name);
  307.                     }
  308.                     this.menuItemsCache[name] = item;
  309.                 }
  310.                 return this.menuItemsCache[name];
  311.             },
  312.             
  313.             // 更新状态栏
  314.             updateStatus: function(message) {
  315.                 var time = new Date().toLocaleTimeString();
  316.                 $('#status-bar').text('[' + time + '] ' + message);
  317.             }
  318.         };
  319.         
  320.         // 切换移动菜单
  321.         function toggleMobileMenu() {
  322.             $('#vertical-menu').toggle();
  323.             if ($('#vertical-menu').is(':visible')) {
  324.                 $('#vertical-menu').menu('show', {
  325.                     left: 0,
  326.                     top: $('.header').height()
  327.                 });
  328.                 MyApp.Menu.updateStatus('显示移动菜单');
  329.             } else {
  330.                 MyApp.Menu.updateStatus('隐藏移动菜单');
  331.             }
  332.         }
  333.         
  334.         // 初始化应用
  335.         $(function() {
  336.             MyApp.Menu.init();
  337.         });
  338.     </script>
  339. </body>
  340. </html>
复制代码

8. 总结

jQuery EasyUI的水平菜单组件是一个功能强大、易于使用的导航解决方案。通过本文的详细介绍,我们从基础入门到高级应用,全面了解了jQuery EasyUI水平菜单的各个方面:

1. 基础入门:我们学习了如何创建基本的水平菜单,包括必要的HTML结构和简单的配置。
2. 配置选项:深入了解了菜单的各种配置选项,包括基本配置和高级配置,以及如何根据项目需求进行灵活配置。
3. 事件处理:掌握了菜单的各种事件及其处理方法,学习了如何响应用户的交互行为。
4. 动态菜单创建:学习了如何动态添加、修改和删除菜单项,以满足动态变化的应用需求。
5. 响应式设计:了解了如何实现响应式菜单,使菜单能够适应不同设备和屏幕尺寸。
6. 项目实战技巧与注意事项:通过实际项目示例,学习了性能优化、常见问题解决方案和最佳实践。

基础入门:我们学习了如何创建基本的水平菜单,包括必要的HTML结构和简单的配置。

配置选项:深入了解了菜单的各种配置选项,包括基本配置和高级配置,以及如何根据项目需求进行灵活配置。

事件处理:掌握了菜单的各种事件及其处理方法,学习了如何响应用户的交互行为。

动态菜单创建:学习了如何动态添加、修改和删除菜单项,以满足动态变化的应用需求。

响应式设计:了解了如何实现响应式菜单,使菜单能够适应不同设备和屏幕尺寸。

项目实战技巧与注意事项:通过实际项目示例,学习了性能优化、常见问题解决方案和最佳实践。

在实际项目中,合理运用jQuery EasyUI水平菜单的各种特性和技巧,可以创建出功能丰富、用户体验良好的导航系统。同时,结合响应式设计和性能优化,可以确保菜单在各种设备和环境下都能正常工作,提供一致的用户体验。

希望本文能够帮助读者全面掌握jQuery EasyUI水平菜单的使用方法,并在实际项目中灵活应用,创建出优秀的Web应用程序。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

频道订阅

频道订阅

加入社群

加入社群

联系我们|TG频道|RSS

Powered by Pixtech

© 2025 Pixtech Team.