一个通用的键盘快捷键处理JS

最近比较无聊!!!!! 写了一个通用的键盘快捷键处理方法,handler.js文件如下:

  /**
	*--------------- 键盘快捷键处理 -----------------
	*
	* 功能:设置键盘快捷操作
	* 使用说明:可直接看keyhandler.html里面的示例
	*	1.在页面结尾处引入此js文件.
	*
	*	2.在文档结尾部分设置键盘键函数.
	* 
	*	3.单键处理:
	*		//向下方向键  keyCode为40
	*		document.body.addKeyDown(40, function(){
	*			//TODO 操作内容
	*		});
	*  
	*	4.组合键处理:
	*		Alt、Shift、Ctrl组合别的键:
	*		//Ctrl+S  S的keyCode为83
	*		document.body.addKeyDown(83, function(){
	*			if (window.event.ctrlKey){
	*				//TODO 操作内容
	*			}
	*		});
	*		普通组合键有点麻烦,在现实中用的也比较少,keyhandler.html中有q+w的组合例子。
	*		超过两个以上的键,目前尚未知如何处理。
	*  
	*	5.此JS中默认提供了CTRL+S,CTRL+ENTER,ALT+ENTER,SHIFT+ENTER四个组合键
	*	  只需要实现具体的function:f_ctrl_s();f_ctrl_enter();f_alt_enter();f_shift_enter();
	*   
	*	6.关于keyCode:所有的键盘键event都有对应的keyCode值,如S的keyCode为83,或者直接设置"S",系统自动获取keyCode值。
	* 
	* @author yehailong 20060118
	*
	*--------------- 键盘快捷键处理 -----------------
   */
///
function addKeyHandler(element) {
	element._keyObject = new Array();
	element._keyDisable = new Array();
	//系统捕获键盘键的keydown、keyup、keypress等事件操作,采用关联数组的方式定义
	element._keyObject["keydown"] = new Array();
	element._keyObject["keyup"] = new Array();
	element._keyObject["keypress"] = new Array();
	
	element._keyDisable["keydown"] = new Array();
	element._keyDisable["keyup"] = new Array();
	element._keyDisable["keypress"] = new Array();

	//增加快捷键
	element.addKeyDown = function (keyCode, action) {
		element._keyObject["keydown"][getKeyCode(keyCode)] = action;
	}
	
	//释放快捷键
	element.removeKeyDown = function (keyCode) {
		element._keyDisable["keydown"][getKeyCode(keyCode)] = true;
	}
	//恢复快捷键
	element.restoreKeyDown = function (keyCode) {
		if(element._keyObject["keydown"][getKeyCode(keyCode)]!=null){
			element._keyDisable["keydown"][getKeyCode(keyCode)] = false;
		}
	}

	element.addKeyUp = function (keyCode, action) {
		element._keyObject["keyup"][keyCode] = action;
	}
	
	element.removeKeyUp = function (keyCode) {
		element._keyDisable["keyup"][keyCode] = true;
	}

	element.restoreKeyUp = function (keyCode) {
		if(element._keyObject["keyup"][keyCode]!=null){
			element._keyDisable["keyup"][keyCode] = false;
		}
	}

	element.addKeyPress = function (keyCode, action) {
		element._keyObject["keypress"][keyCode] = action;
	}
	
	element.removeKeyPress = function (keyCode) {
		element._keyDisable["keypress"][keyCode] = true;
	}
	
	element.restoreKeyPress = function (keyCode) {
		if(element._keyObject["keypress"][keyCode]!=null){
			element._keyDisable["keypress"][keyCode] = false;
		}
	}
	
	//获取keyCode
	function getKeyCode(keyCode){
		//如果是数字
		if(0+keyCode==keyCode){
			return keyCode;
		}else{
			keyCode = keyCode.toUpperCase();
			return keyCode.charCodeAt(0);
		}
	}

	function handleEvent() {
		var type = window.event.type;
		var code = window.event.keyCode;
		
		//相应键盘键function
		if (element._keyObject[type][code] != null) {
			if(element._keyDisable[type][code]=="undefined"
				||!element._keyDisable[type][code]){
				
				if(event.keyCode!=getKeyCode("/r")){
					window.event.returnValue = false;
				}
				//try{
					element._keyObject[type][code]();
				//}catch(e){}
			}
		}
	}
	
	element.onkeypress = handleEvent;
	element.onkeydown = handleEvent;
	element.onkeyup = handleEvent;
}

//捕获键
addKeyHandler(document.body);

//----预先定义了一些快捷键操作,具体的实现函数需要在对应的页面中提供----------//

//Ctrl+S
document.body.addKeyDown("S", function(){
	if (window.event.ctrlKey){
		//TODO 需要提供具体的函数实现
		f_ctrl_s();
	}
});

//ENTER 键操作
document.body.addKeyDown("/r", function(){
	if (window.event.ctrlKey){
		//TODO CTRL+ENTER
		f_ctrl_enter();
	}else if (window.event.altKey){
		//TODO ALT+ENTER
		f_alt_enter();
	}else if (window.event.shiftKey){
		//TODO SHIFT+ENTER
		f_shift_enter();
	}else{
		var source = event.srcElement;	
		if(source.tagName == "INPUT" && (source.type =="button" || source.type=="submit")){		
			event.keyCode=32;		
		}else {
			event.keyCode = 9;
		}
	}
});
 
对应的测试html如下,提供键盘方向键快捷跳转,以及ctrl组合键等:
<body >
可使用上下左右方向键切换:
<table id="table1" border=1>
<tr>
	<td><input type="text" name="test" onfocus="setFocus(this)"></td>
	<td><input type="text" name="test" onfocus="setFocus(this)"></td>
	<td><input type="text" name="test" onfocus="setFocus(this)"></td>
	<td><input type="text" name="test" onfocus="setFocus(this)"></td>
</tr>
<tr>
	<td><input type="text" name="test" onfocus="setFocus(this)"></td>
	<td><input type="text" name="test" onfocus="setFocus(this)"></td>
	<td><input type="text" name="test" onfocus="setFocus(this)"></td>
	<td><input type="text" name="test" onfocus="setFocus(this)"></td>
</tr>
<tr>
	<td><input type="text" name="test" onfocus="setFocus(this)"></td>
	<td><input type="text" name="test" onfocus="setFocus(this)"></td>
	<td><input type="text" name="test" onfocus="setFocus(this)"></td>
	<td><input type="text" name="test" onfocus="setFocus(this)"></td>
</tr>
<tr>
	<td>
	<select name="test" onfocus="setFocus(this)" >
		<option>1</option>
		<option>2</option>
		<option>3</option>
		<option>4</option>
	</select>
	</td>
	<td>
	<select name="test" onfocus="setFocus(this)" >
		<option>1</option>
		<option>2</option>
		<option>3</option>
		<option>4</option>
	</select>
	</td>
	<td>
	<select name="test" onfocus="setFocus(this)" >
		<option>1</option>
		<option>2</option>
		<option>3</option>
		<option>4</option>
	</select>
	</td>
	<td><input type="text" name="test" onfocus="setFocus(this)"></td>
	</td>
</tr>
</table>
<input type="button" id="b1" value="Ctrl+Enter" onclick="alert(this.value)">
<input type="button" id="b2" value="Alt+Enter" onclick="alert(this.value)">
<input type="button" id="b3" value="Shift+Enter" onclick="alert(this.value)">
<input type="button" id="b4" value="Ctrl+S" onclick="alert(this.value)">
<input type="button" id="b5" value="Q+W" onclick="alert(this.value)">
<span id="msg"></span>
</body>
<SCRIPT src="keyhandler.js" ></SCRIPT>
<script>

//------------以下为设置焦点,键盘方向快捷键-----------//
//一行的input个数
var size = 0;
var focusObj = null;
var updown = true;
//对象焦点定位
function setFocus(obj){
	try{
		if(obj.type=="text"){
			var rng = obj.createTextRange(); rng.collapse(false); rng.select();
		}
	}catch(e){}

	if(obj.tagName == "SELECT"){
		updown = false;
	}else{
		updown = true;
	}
	focusObj = obj;
	restoreKey();
}
var allInput = new Array();
var doFlag = false;
//setArray();
function setArray(){
	if(!doFlag){
		var k = 0;
		var table = document.getElementById("table1");
		for(var i = 0; i < table.rows.length; i++){
			var cells = table.rows[i].cells;
			for(var j=0;j<cells.length;j++){ 
				//取childNodes[0],如果input外套<span>、<div>等标签,根据实际情况调整
				var box = cells[j].childNodes[0];	
				if(box!=null&&(box.type=="text"||box.tagName=="SELECT")){
					allInput[k] = box;
					k++;
					if(i==0) size++;
				}
			}
		}
		doFlag = true;
	}
	
}

function down(){
	//向下
	go(size);
}
function up(){
	//向上
	go(0-size);	
}
function left(){
	//向左
	go(-1);	
}
function right(){
	//向右
	go(1);	
}
function go(num){
	setArray();
	var index = -1;
	for(var i=0;i<allInput.length;i++){
		if(focusObj==allInput[i]){
			index = i;
			break;	
		}
	}
	if(index==-1)
		return false;
	index += num;
	if(index>allInput.length-1)index = index-allInput.length;
	if(index<0)index = allInput.length+index;
	try{
		allInput[index].focus();
	}catch(e){}
}

function restoreKey(){
	//恢复上下键
	document.body.restoreKeyDown(40);
	document.body.restoreKeyDown(38);
}

//捕获键盘事件
//addKeyHandler(document.body);
document.body.addKeyDown(40, function(){
	if(updown){
		down();
	}else{
		//select定位时候,还需要正常的上下键
		document.body.removeKeyDown(40);
	}
});
document.body.addKeyDown(38, function(){
	if(updown){
		up();
	}else{
		//select定位时候,还需要正常的上下键
		document.body.removeKeyDown(38);
	}
});
document.body.addKeyDown(39, function(){
	right();
});
document.body.addKeyDown(37, function(){
	left();
});
//------------键盘方向快捷键ok-----------//


//------------组合快捷键测试-----------//

//Q+W
var w=false, q=false;
document.body.addKeyDown(81, function() {
	q = true;
	if (q && w) {
		document.getElementById("msg").innerHTML="Q+W";
	}
});
document.body.addKeyUp(81, function() {
	q = false; 
	document.getElementById("msg").innerHTML="";
});

document.body.addKeyDown(87, function() {
	w = true; 
	if (q && w) {
		document.getElementById("msg").innerHTML="Q+W";
	}
});
document.body.addKeyUp(87, function() {
	w = false; 
	document.getElementById("msg").innerHTML="";
});

//实现默认提供的几个快捷键
//CTRL+S
function f_ctrl_s(){
	document.getElementById("b4").click();
}

function f_ctrl_enter(){
	document.getElementById("b1").click();
}
function f_alt_enter(){
	document.getElementById("b2").click();
}
function f_shift_enter(){
	document.getElementById("b3").click();
}
</script>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值