nav.html 5.19 KB
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Keyboard Navigation in MenuButton - jQuery EasyUI Demo</title>
	<link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
	<link rel="stylesheet" type="text/css" href="../../themes/icon.css">
	<link rel="stylesheet" type="text/css" href="../demo.css">
	<script type="text/javascript" src="../../jquery.min.js"></script>
	<script type="text/javascript" src="../../jquery.easyui.min.js"></script>
</head>
<body>
	<h2>Keyboard Navigation in MenuButton</h2>
	<p>Press Alt+W to focus the menubutton. Once the menubutton get focus, you will be able to navigate menubutton using keyboard keys.</p>
	<div style="margin:20px 0;"></div>
	<div class="easyui-panel" style="padding:5px;">
		<a id="btn-home" href="#" class="easyui-linkbutton" data-options="plain:true">Home</a>
		<a href="#" class="easyui-menubutton" data-options="menu:'#mm1',iconCls:'icon-edit'">Edit</a>
		<a href="#" class="easyui-menubutton" data-options="menu:'#mm2',iconCls:'icon-help'">Help</a>
		<a href="#" class="easyui-menubutton" data-options="menu:'#mm3'">About</a>
	</div>
	<div id="mm1" style="width:150px;">
		<div data-options="iconCls:'icon-undo'">Undo</div>
		<div data-options="iconCls:'icon-redo'">Redo</div>
		<div class="menu-sep"></div>
		<div>Cut</div>
		<div>Copy</div>
		<div>Paste</div>
		<div class="menu-sep"></div>
		<div>
			<span>Toolbar</span>
			<div>
				<div>Address</div>
				<div>Link</div>
				<div>Navigation Toolbar</div>
				<div>Bookmark Toolbar</div>
				<div class="menu-sep"></div>
				<div>New Toolbar...</div>
			</div>
		</div>
		<div data-options="iconCls:'icon-remove'">Delete</div>
		<div>Select All</div>
	</div>
	<div id="mm2" style="width:100px;">
		<div>Help</div>
		<div>Update</div>
		<div>About</div>
	</div>
	<div id="mm3" class="menu-content" style="background:#f0f0f0;padding:10px;text-align:left">
		<img src="http://www.jeasyui.com/images/logo1.png" style="width:150px;height:50px">
		<p style="font-size:14px;color:#444;">Try jQuery EasyUI to build your modern, interactive, javascript applications.</p>
	</div>

	<script type="text/javascript">
		(function($){
			function getParentMenu(rootMenu, menu){
				return findParent(rootMenu);

				function findParent(pmenu){
					var p = undefined;
					$(pmenu).find('.menu-item').each(function(){
						if (!p && this.submenu){
							if ($(this.submenu)[0] == $(menu)[0]){
								p = pmenu;
							} else {
								p = findParent(this.submenu);
							}
						}
					});
					return p;
				}
			}
			function getParentItem(pmenu, menu){
				var item = undefined;
				$(pmenu).find('.menu-item').each(function(){
					if ($(this.submenu)[0] == $(menu)[0]){
						item = $(this);
						return false;
					}
				});
				return item;
			}

			$.extend($.fn.menubutton.methods, {
				enableNav: function(enabled){
					var curr;
					$(document).unbind('.menubutton');
					if (enabled == undefined){enabled = true;}
					if (enabled){
						$(document).bind('keydown.menubutton', function(e){
							var currButton = $(this).find('.m-btn-active,.m-btn-plain-active,.l-btn:focus');
							if (!currButton.length){
								return;
							}

							if (!curr || curr.button != currButton[0]){
								curr = {
									menu: currButton.data('menubutton') ? $(currButton.menubutton('options').menu) : $(),
									button: currButton[0]
								};
							}
							var item = curr.menu.find('.menu-active');

							switch(e.keyCode){
								case 13:  // enter
									item.trigger('click');
									break;
								case 27:  // esc
									currButton.trigger('mouseleave');
									break;
								case 38:  // up
									var prev = !item.length ? curr.menu.find('.menu-item:last') : item.prevAll('.menu-item:first');
									prev.trigger('mouseenter');
									return false;
								case 40:  // down
									var next = !item.length ? curr.menu.find('.menu-item:first') : item.nextAll('.menu-item:first');
									next.trigger('mouseenter');
									return false;
								case 37:  // left
									var pmenu = getParentMenu(currButton.data('menubutton') ? $(currButton.menubutton('options').menu) : $(), curr.menu);
									if (pmenu){
										item.trigger('mouseleave');
										var pitem = getParentItem(pmenu, curr.menu);
										if (pitem){
											pitem.trigger('mouseenter');
										}
										curr.menu = pmenu;
									} else {
										var prev = currButton.prevAll('.l-btn:first');
										if (prev.length){
											currButton.trigger('mouseleave');
											prev.focus();
										}
									}
									return false;
								case 39:  // right
									if (item.length && item[0].submenu){
										curr.menu = $(item[0].submenu);
										curr.button = currButton[0];
										curr.menu.find('.menu-item:first').trigger('mouseenter');
									} else {
										var next = currButton.nextAll('.l-btn:first');
										if (next.length){
											currButton.trigger('mouseleave');
											next.focus();
										}
									}
									return false;
							}
						});						
					}
				}
			});
		})(jQuery);

		$(function(){
			$.fn.menubutton.methods.enableNav();
			$(document).keydown(function(e){
				if (e.altKey && e.keyCode == 87){
					$('#btn-home').focus();
				}
			})
		});
	</script>
</body>
</html>