`
liuhaoyi490
  • 浏览: 23083 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

javascript快捷键实现

阅读更多

       在互联网上关于javascript快捷键实现的方式寥寥无几,而且不能满足当前项目要求,应项目组要求关于网页快捷键提供一个相对通用的解决方案,因此产生此篇文章。

一、项目需求:

      1、使用键盘上的左、右键在各个控件之间进行焦点转移。左键向上转移焦点(类似与shift+tab键);右键向下转移焦点(类似与tab键)。

       2、使用键盘上下键在列表中上下转移焦点。

       3、能够使用enter、esc键进行form表单数据保存、取消。

二、总体思路:

      html各控件本身都提供了tab-index属性,设置该属性后通过tab键就可以实现焦点在各控件间按照tab-index值,由小到大进行焦点转移。

1、在网页进行装载(调用body的onload事件)时候将所有具有tab-index的控件放入Array数组中,按照tab-index值排序。

2、在按左、右键的时,定位当前控件,然后在定位Array中的前一个或后一个控件,然后让该控件获得焦点。

3、关于上、下键进行表单跳转,强制要求元素必须在html的table表格中,通过表格的上下td进行焦点转移,具体实现可以参见实现代码。

三、实现代码:

     实现由一个js文件和一个html测试页面组成。

1、hotkey.js文件,该文件以prototype方式定义HotKey类,该类包括快捷键定义、上下左右转移方法实现、快捷键注册方法。具体内容如下所示:

var __KEY_ADDNEW	= 65;
var __KEY_SAVE	= 13;
var __KEY_ESC 	= 27;
var __KEY_LEFT	= 37;
var __KEY_RIGHT	= 39;
var __KEY_UP	= 38;
var __KEY_DOWN	= 40;
function HotKey(){
	this.keyArray = new Array();
	this.tabArray = new Array();
	//this._self = this;
	var _self = this;
	var _arr = new Array();
	_arr.push(this);
	this.registerKey(__KEY_LEFT,this.movetoprevious,_arr);
	this.registerKey(__KEY_RIGHT,this.movetonext,_arr);
	this.registerKey(__KEY_DOWN,this.movetodown);
	this.registerKey(__KEY_UP,this.movetoup);
}

HotKey.prototype.loadTabElements = function(){	
	var _ele = document.getElementsByTagName("input");
	for(var i=0;i<_ele.length;i++){
		if(null!=_ele[i].getAttribute("tabIndex")){
			this.tabArray.push({"tabIndex":_ele[i].getAttribute("tabIndex"),"element":_ele[i]});
		}
	}
	this.tabArray.sort(function compare(a,b){
							return Number(a.tabIndex)-Number(b.tabIndex);
						}
					);

	
}
HotKey.prototype.getTabArray=function(){
	return this.tabArray;
}
//转移到下一个焦点(tab)
HotKey.prototype.movetonext=function(p_hotkey){
	var _array = p_hotkey.getTabArray();
	if(event.srcElement==_array[_array.length-1].element){
		_array[0].element.focus();				
		_array[0].element.select();
		return;
	}
	for(var i=0;i<_array.length;i++){
		if(event.srcElement==_array[i].element){
			if(null!=_array[i+1]){
				_array[i+1].element.focus();				
				_array[i+1].element.select();
			}
		}
	}	
}
//转移到上一个焦点(shift+tab)
HotKey.prototype.movetoprevious=function(p_hotkey){
	var _array = p_hotkey.getTabArray();
	if(event.srcElement==_array[0].element){
		_array[_array.length-1].element.focus();				
		_array[_array.length-1].element.select();	
		return;
	}
	for(var i=_array.length-1;i>-1;i--){
		if(event.srcElement==_array[i].element){
			if(null!=_array[i-1]){
				_array[i-1].element.focus();				
				_array[i-1].element.select();
			}
		}
	}	
}
HotKey.prototype.movetodown=function(){
	var _td = event.srcElement.parentNode;
	var _tr = _td.parentNode;
	var _tbl = _tr.parentNode.parentNode;
	if(null==_tbl || "TABLE"!=_tbl.tagName) return;
	var k = 0;
	for(var i=0;i<_tr.cells.length;i++){
		if(_td==_tr.cells[i]) {
			k=i;
			break;
		}
	}
	var _nexttr = _tr.nextSibling;
	if(null==_nexttr) return;
	_nexttr.cells[k].childNodes[0].focus();
	_nexttr.cells[k].childNodes[0].select();
}
HotKey.prototype.movetoup=function(){
	var _td = event.srcElement.parentNode;
	var _tr = _td.parentNode;
	var _tbl = _tr.parentNode.parentNode;
	if(null==_tbl || "TABLE"!=_tbl.tagName) return;
	var k = 0;
	for(var i=0;i<_tr.cells.length;i++){
		if(_td==_tr.cells[i]) {
			k=i;
			break;
		}
	}
	var _previousttr = _tr.previousSibling;
	if(null==_previousttr) return;
	_previousttr.cells[k].childNodes[0].focus();
	_previousttr.cells[k].childNodes[0].select();
}

HotKey.prototype.registerKey=function(p_key,p_callback,p_args){
	//判断是否重复注册,新的替换旧的;
	var isexist = false;
	for(var i=0;i<this.keyArray.length;i++){
		if(p_key==this.keyArray[i].key){
			this.keyArray[i]={"key":p_key,"_callback":p_callback,"_args":p_args};
			isexist=true;

		}
	}
	if(!isexist){
		this.keyArray.push({"key":p_key,"_callback":p_callback,"_args":p_args});
	}
	var _self = this;
	document.onkeydown=function(){
		for(var i=0;i<_self.keyArray.length;i++){				
			if(event.keyCode==_self.keyArray[i].key){ 
				if(null==_self.keyArray[i]._args || _self.keyArray[i]._args=="undefined"){
					var _array = new Array();
					_array.push(event);
					_self.keyArray[i]._callback.apply(this,_array);
				}else{
					_self.keyArray[i]._args.push(event);
					_self.keyArray[i]._callback.apply(this,_self.keyArray[i]._args);
				}
				event.returnValue=false;
				break;

			}
		}			
	}
}

  2、hotkey.htm文件,用来演示快捷键实现的参考样例。代码如下所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=gbk" />
<meta http-equiv="content-language" content="zh-CN" />
<title> new document </title>
<script language=JScript.Encode src="hotkey.js"></script>	
 
<style type="text/css"> 
*:focus {
	border:1px dotted blue;
}
</style>
</head>
 
<body onload="hotkey.loadTabElements();">
<input type="text" name="oo" tabIndex="1" value="1">
<table id="tt" border="1">
	<tr>
		<td>1</td>
		<td><input id="yy" type="checkbox" tabIndex="2"><input id="yyy" type="hidden"></td>
		<td id="11"><input name="kk[0]" value="0000" tabIndex="3"></td>
		<td>&nbsp;</td><td><input name="jj[0]" value="00001111" tabIndex="4"></td>
		<td>&nbsp;</td>
	</tr>
	<tr>
		<td>2</td><td><input type="checkbox" tabIndex="5"><input id="yyy" type="hidden"></td>	<td><input name="kk[1]" tabIndex="6"></td><td>&nbsp;</td><td><input name="jj[1]" tabIndex="7"> </td><td>&nbsp;</td>
	</tr>
</table>
<input type="text" name="yy" tabIndex="8">
<input type="text" name="tt" tabIndex="9">
<br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<script language="JavaScript"> 
<!--
 
var hotkey = new HotKey();
var arr = new Array();
arr.push("save is ok");
hotkey.registerKey(__KEY_SAVE,toSave,arr);
hotkey.registerKey(__KEY_ESC,toEsc,null);
//hotkey.registerKey(__KEY_UP,toup,null);
 
function toup(){
	alert("toup");
}
function toSave(v){	
	alert(v);
}
function toEsc(){	
	alert("esc");
}
 
//-->
</script>
</body>
</html>

 说明:

  1、在页面设计时指定进行焦点停留控件的tab-index属性值。

  2、在页面加载时,必须指定body的onload=hotkey.loadTabElements()。

  3、可以使用registerKey方法对程序中已经注册的键盘事件进行复写。

 

分享到:
评论

相关推荐

    javascript快捷键

    ### JavaScript快捷键实现原理 在Web开发中,有时候我们需要为网站添加一些快捷键功能,比如在特定元素上弹出菜单或执行某个操作等。通过JavaScript,我们可以轻松地实现这一功能。本例中,作者利用了JavaScript来...

    JavaScript+快捷键设置

    ### JavaScript与快捷键设置知识点详解 #### 一、概述 在网页开发中,为了提高用户体验以及增加网页的安全性,开发者常常会使用JavaScript来控制或监听用户的键盘操作,比如禁用某些快捷键的功能或者添加自定义...

    Eclipse快捷键大全 javascript鼠标事件汇总

    了解并熟练使用这些Eclipse快捷键和JavaScript鼠标事件,能让你在开发过程中如鱼得水,提高编程效率,减少不必要的鼠标移动和点击,从而专注于更重要的逻辑实现。同时,文档`javascript鼠标事件汇总.doc`和`Eclipse...

    JavaScript快捷键库keymage.zip

    Keymage 是用 JavaScript 实现的极小的处理快捷键绑定的库,它没有任何的依赖项,非常容易扩展,用户很容易就能使用它开发一个新的库。 标签:keymage

    javascript onkeydown实现键盘快捷键控制页面.docx

    ### JavaScript onkeydown 实现键盘快捷键控制页面 #### 核心知识点概述 本文将详细介绍如何使用 JavaScript 的 `onkeydown` 事件来实现键盘快捷键的功能,以达到对页面进行控制的目的。通过这种方式,用户可以...

    JavaScript快捷键库ShortcutJS.zip

    Shortcut.js 可以让你实现键盘快捷键和应用功能之间的绑定。 一些快捷键定义: Shortcut Event Name j shortcutNextItem k shortcutPrevItem n shortcutNewItem o ...

    js前端实现的组合快捷键demo(类似QQ截图快捷键等)

    功能:通过JavaScript代码,实现用户自定义的组合快捷键功能。用户可以在网页上设置多个快捷键组合,当按下这些组合时,会触发相应的事件或执行特定的操作。 能做到什么: 1. 提高交互性:通过组合快捷键,用户可以...

    javascript经典特效---快捷键提交按钮.rar

    在JavaScript编程领域中,...总的来说,通过JavaScript实现快捷键提交按钮涉及到的要点包括:事件监听、键盘事件处理、表单提交以及数据验证。熟练掌握这些技术,可以帮助开发者创建更高效、更具用户体验的Web应用。

    js设置快捷键

    "js设置快捷键"这个主题正是关于如何在JavaScript中实现这一功能。 Hotkeys 是一个强大的JavaScript库,专门用于捕获键盘输入和组合键。它体积小巧,压缩后仅有约3kb,这意味着即使在资源有限的环境中,也能快速、...

    Qt QTextEdit 实现快捷键注释功能

    本篇文章将详细探讨如何在QTextEdit中实现快捷键注释功能,以`Ctrl + /`为快捷键,以及通过点击按钮来实现代码注释的功能。 首先,我们需要了解QTextEdit的基本用法。QTextEdit继承自QAbstractScrollArea,它可以...

    jquery实现快捷键事件,自己做一个快捷键

    3. **编写JavaScript代码**:接下来,我们需要编写jQuery代码来实现快捷键监听和处理。例如,我们可以为选中的行绑定一个快捷键,如Ctrl+S,弹出对话框进行编辑: ```javascript $(document).ready(function() { ...

    添加快捷键组合的javascript类库 - keyboard.js 编辑

    这对于实现更精确的控制非常有用,例如只在某个表单或编辑器内响应快捷键。 `demo.html` 文件可能是一个示例页面,展示如何在实际项目中使用 `keyboard.js`。在这个文件中,开发者通常会看到如何将 `keyboard.js` ...

    javascript onkeydown实现键盘快捷键控制页面

    JavaScript 实现键盘快捷键控制页面 JavaScript 是一种广泛使用的编程语言,用于实现客户端的交互操作。在 Web 开发中,JavaScript 广泛应用于实现页面交互、动画效果、表单验证等功能。本节课,我们将学习如何使用...

    Electron中通过globalShortcut实现监听键盘事件进而实现快捷键功能示例代码.zip

    在Electron框架中,开发桌面应用时,常常需要实现快捷键功能来提高用户交互的便捷性。`globalShortcut`模块是Electron提供的一种方便的方法,它允许开发者注册全局快捷键,当用户按下这些快捷键组合时,触发相应的...

    在myeclipse中实现javascipt 的快捷键

    在MyEclipse中设置JavaScript快捷键的步骤如下: 1. 打开MyEclipse的首选项设置:点击菜单栏的“Window” -&gt; “Preferences”,或者直接使用快捷键`Ctrl +` `+` `2`输入“Preferences”并回车。 2. 导航到...

    javascript实现中文输入法

    3. **用户交互**:在前端实现输入法,需要设计友好的用户界面,包括候选词框、上下文关联的候选词推荐、快捷键操作等。用户输入拼音后,系统应能实时更新候选词列表,并允许用户通过鼠标或键盘进行选择。 4. **事件...

    jquery_键盘快捷键

    它的API设计使得编写JavaScript代码变得更加简洁,易于理解和实现。 二、键盘事件 在JavaScript中,键盘事件主要包括`keydown`、`keyup`和`keypress`。`keydown`在按键被按下时触发,`keyup`在按键被释放时触发,而...

Global site tag (gtag.js) - Google Analytics