項目中遇到用Tab鍵、方向鍵切換頁面控件焦點的問題,Tab鍵控制比較容易實現,只要依次在想要控制焦點順序的控件標簽上添加屬性TabIndex和TabStop兩個屬性,TabIndex屬性值從1開始根據控制順序依次遞增,TabStop值設為"True"。而要實現方向鍵的控制,還是費了一番周折。
首先從網上查找資料,得到一個獲取頁面所有Input類型控件的方法:
http://www.poluoluo.com/jzxy/201208/172374.html
但經過嘗試,這種方法并不能解決頁面中存在其他類型控件的問題,比如碰到select類型控件時,焦點切換就會出現混亂,以至于達不到想要的效果。
尋找利用其他方法獲取頁面中的元素,最后根據前輩提示,可以利用JQuery的選擇器來實現,JQuery當時還沒有接觸,所以找了相關資料,解決了此問題,改進后的JS代碼如下(以下是兩列輸入或選擇控件,豎向切換焦點情況的實現):
~~~
function keyDown(event) {
var inputs = $(".txt")
var focus = document.activeElement;
if (!document.getElementById("mm").contains(focus)) return;
var event = window.event || event;
var key = event.keyCode;
for (var i = 0; i < inputs.length; i++) {
if (inputs[i] === focus) {
break;
}
}
switch (key) {
case 38:
if (i - 2 >= 0) inputs[i - 2].focus();
break;
case 40:
if (i + 2 < inputs.length) inputs[i + 2].focus();
break;
case 13:
event.returnValue = false;//阻止自動提交
if (i + 2 < inputs.length) inputs[i + 2].focus();
break;
}
}
~~~
只需在html代碼中引進JQuery,并在需要獲取的元素中設置class值為"txt"即可獲取所有控件。但還是存在不足,當頁面中有disabled屬性為true的情況下,使用方向鍵也會出現錯亂的情況。再次進行改進,加入必要邏輯判斷,最終得出如下結局方案:
~~~
//方向鍵控制頁面控件焦點移動
function keyDown(event) {
var inputs = $(".txt") //通過class屬性值獲取控件組合
var focus = document.activeElement; //得到處于激活狀態的控件
if (!document.getElementById("mm").contains(focus)) return; //判斷是否包含激活控件在指定的Table下
var event = window.event || event; //獲取事件
var key = event.keyCode; //得到按下的鍵盤Ascii碼
var flag = -1;
//得到激活控件在組合中的具體位置
for (var i = 0; i < inputs.length; i++) {
if (inputs[i] === focus) {
break;
}
}
switch (key) {
case 38: //向上鍵
var j = i - 2;
var flag = false;
if (inputs.get(j).disabled == false) { //判斷接下來得到的焦點控件是否能夠使用
flag = true;
} else {
for (j=i-4; j >= 0; j=j-2) { //之后控件不能獲得焦點情況下尋找下一個控件
if (inputs.get(j).disabled == false) { //判斷之后焦點是否可以獲取焦點
flag = true;
break;
}
}
}
if (flag) {
inputs[j].focus();
}
break;
case 40: //向下鍵
var j = i + 2;
var flag = false;
if (inputs.get(j).disabled == false) { //判斷接下來得到的焦點控件是否能夠使用
flag = true;
} else {
for (j = i + 4; j < inputs.length; j = j + 2) { //之后控件不能獲得焦點情況下尋找下一個控件
if (inputs.get(j).disabled == false) { //判斷之后焦點是否可以獲取焦點
flag = true;
break;
}
}
}
if (flag) {
inputs[j].focus();
}
break;
case 13: //回車鍵
event.returnValue = false; //阻止自動提交
var j = i + 2;
var flag = false;
if (inputs.get(j).disabled == false) {
flag = true;
} else {
for (j = i + 4; j <= inputs.length - 1; j = j + 2) {
if (inputs.get(j).disabled == false) {
flag = true;
break;
}
}
}
if (flag) {
inputs[j].focus();
}
break;
}
}
~~~
至此,解決了實現中存在的主要問題,考慮到左右方向鍵可以在輸入字符中切換光標位置,則在處理過程中沒有加入左右鍵切換控件焦點的功能。回想用戶提出此功能的需求,同設計軟件一致,是要提高工作效率,避免鼠標、鍵盤之間的來回切換,也由此找到一份[WEB交互界面易用性設計和驗收的指導性原則](http://blog.csdn.net/mz24/article/details/413028)僅供參考學習。
總結:項目中總會遇到各種各樣的問題,有問題不可怕,可怕的是不努力想辦法去解決它,而是消極應對。把每一個問題當作一次學習、提高的機會,這樣的項目驅動才是真正我們要達到的目的,才剛剛開始做項目,保持一份積極的態度去學習、研究,抓住每一次的學習機會,項目即是學習。
文中的問題伴隨了我幾天的時間,最后通過自己的努力解決,其實更重要的收獲是改變了一些我的觀念,讓自己始終保持興奮的狀態去抓住身邊每個學習的機會。