使用方向鍵切換INPUT焦點之左右鍵補遺

兩年前曾在一個小專案實作過"利用方向鍵切換<INPUT>輸入焦點",當時留了一個小尾巴: 若直接攔截左、右鍵切換焦點,輸入文字時會喪失用左右鍵移動游標的功能,有違使用者的操作預期,因此實際上線時只保留了上下切換,左右移動部分仍得依賴Tab及Shift-Tab。

最近又有機會處理該專案的功能擴充需求,翻寫到同一支js。為了證明自己並非馬齒徒長,兩年來技術上還是有一丁點小長進,就順手把左右鍵切換焦點的功能也補起來囉~~

聽起來好像很厲害,其實我只是沾了jCaret這個好用jQuery Plugin的光,按下左右鍵時多檢查文字游標,先確認當時游標指向的是輸入位置(而非反白選取了某段文字),之後再由游標所在位置決定是否要切換焦點。當游標已在最前方時按左鍵游標已在最後方時按右鍵 才需觸發焦點左右移動的邏輯。

程式範例如下,供有興趣的朋友參考:

<!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>
歡迎推文分享:
Published 23 November 2011 05:49 AM 由 Jeffrey
Filed under: ,
Views: 11,443



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<November 2011>
SunMonTueWedThuFriSat
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication