<!DOCTYPE html>
<html>
<head>
<title>Arrow Key Focus Moving</title>
</head>
<body>
<script type='text/javascript'
src='http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.js'></script>
<script type='text/javascript'
src="http://jcaret.googlecode.com/files/jquery.caret.1.02.min.js"></script>
<script type="text/javascript">
$(function () {
var baseIndex = 100;
$("#tblGrid")
.find("tr").each(function (r) {
$(this).find("td").each(function (c) {
$(this).find("input")
.attr("tabindex", r * 100 + c + baseIndex)
.addClass("cGridInput");
});
});
$("#tblGrid").on("keydown", ".cGridInput", function (evt) {
var origTabIdx = parseInt($(this).attr("tabindex"));
var tabIndex = origTabIdx;
var $c = $(this).caret(); //利用jCaret Plugin取得輸入游標資訊
//確認目前未選取文字段落,游標指向的是文字插入位置
var noSel = $c.start == $c.end;
switch (evt.which) {
case 38: //上
tabIndex -= 100;
break;
case 40: //下
tabIndex += 100;
break;
case 37: //左(未選取文字,且游標在最前方時才切換)
if (noSel && $c.start == 0) tabIndex--;
break;
case 39: //右(未選取文字,且游標在最後方時才切換)
if (noSel && $c.start >= this.value.length) tabIndex++;
break;
default:
return;
}
if (origTabIdx != tabIndex) {
$(".cGridInput[tabindex=" + tabIndex + "]").focus();
return false;
}
return true;
});
});
</script>
<table id="tblGrid">
<tr><td><input /></td><td><input /></td><td><input /></td><td><input /></td></tr>
<tr><td><input /></td><td><input /></td><td><input /></td><td><input /></td></tr>
<tr><td><input /></td><td><input /></td><td><input /></td><td><input /></td></tr>
</table>
</body>
</html>