AutoTab javascript函数问题

时间:2010-08-11 19:05:39

标签: javascript asp.net

我们在asp.net应用程序中使用它时遇到了这个问题。

它的目的如下:

  • 在文本框中时 - >达到MaxLength后的标签
  • 在复选框中时 - >使用键盘切换控件(空格键)

除了按钮,这些是表单上的唯一控件。该功能由最终用户切换(使用cookie保存)。

的问题:

  • 正如您将注意到的,它是相当随机的过程。有时它会很快执行,有时则不会。我们目前拥有表单集的方式是具有非常大的选项卡索引范围,该范围很可能保留。说实话,并不是真的担心这个问题,但如果有人知道该怎么做,那就太好了。

  • Checkbox功能非常奇怪。假设你有CheckBoxA和CheckBoxB。当您使用键盘切换CheckBoxA时,它会将该框灰色,就像它被禁用一样,并将焦点设置为CheckBoxB。此时,如果您使用鼠标并单击文档上的任意位置,则每次单击并忽略该区域的正常鼠标功能时,它都会切换CheckBoxA,直到您右键单击然后取消上下文菜单。如果你在使用键盘从AutoTab获得焦点后切换CheckBoxB,CheckBoxA会丢失禁用的灰色外观(虽然它从未切换过),并且循环重复,CheckBoxB是有问题的。

以下是对该功能很重要的代码。 CheckCookie()是一个检查,以确保用户设置了AutoTab,否则AutoTab不会发生。 Array.contains遍历数组以查找输入的键码是否存在于其中。

function test(input, inputClientID, e) {
if (checkCookie()) {
    var acceptedChars = ["48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", "96", "97", "98", "99", "100", "101", "102", "103", "104", "105", "106", "107", "108", "109", "110", "111", "186", "187", "188", "189", "190", "191", "192", "219", "220", "221", "222"];
    if (input.type == "text") {
        len = document.getElementById(inputClientID).getAttribute("MaxLength");
        curLen = document.getElementById(inputClientID).getAttribute("Value");
        if ((len != null) && (len != "") && (curLen != null) && (curLen != "")) {
            if (len <= curLen.length) {
                var keycode;
                if (window.event) keycode = window.event.keyCode;


                if (e.shiftKey == true && keycode == 9) {
                    return;
                }
                else if (acceptedChars.contains(keycode)) { //(e.shiftKey == false && keycode != 9)
                    tabNextCtrl(input);
                }
            }
        }
    }
    else if (input.type == null) {
        if (input.firstChild.type == "checkbox") {
            var keycode;
            if (window.event) keycode = window.event.keyCode;

            if (keycode == 32) {

                //if (input.firstChild.checked) {
                //    input.firstChild.checked = false;
                //}
                //else {
                //    input.firstChild.checked = true;
                //}
                tabNextCtrl(input.firstChild);                    
            }
        }
    }
}}

标签是在这里使用排序完成的(我相信问题#2的瓶颈在哪里):

function tabNextCtrl(input) {
var tbIndex = input;
var aIndex = 99999999;

for (i = 0; i < input.form.elements.length; i++) {
    if ((input.form.elements[i].tabIndex > input.tabIndex) && (input.form.elements[i].tabIndex < aIndex)) {
        aIndex = input.form.elements[i].tabIndex;
        tbIndex = input.form.elements[i];
    }
}
tbIndex.focus();
}

我道歉,因为这是非常冗长的(问题不是我知道有一个共同的名字,虽然我之前已经看到过这种行为),但是你对这个问题给予的任何帮助都将非常感激。< / p>

谢谢,

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

 function Tab(currentField, e) {

    if (!(e.keyCode == 8 || e.keyCode == 37) ) {
        if (currentField.value.length == currentField.maxLength) {   
            $(currentField).next('input').focus();
        }
    }
    else{

        if (currentField.value.length == 0) {   
            $(currentField).prev('input').focus();

        }

    }

  }

<input name="phone" id="phone" class="input20p" onkeyup='Tab(this,event)'  maxlength="3"  type="text" border="0">
<input  maxlength="3" class="input20p" name="phone1"   type="text" border="0"   onkeyup='Tab(this,event)'>
<input class="input20p" name="phone2" maxlength="4"   type="text" border="0" onkeyup='Tab(this,event)'  >