javascript - 如果验证函数返回 true,则聚焦下一个元素

标签 javascript html jquery jquery-events

我有多个允许单个数字值的输入。下面的脚本确认该值是一个数字。

输入有效数字后如何将焦点移至下一个输入?

<input type="text" maxlength="1" onkeypress="return isNumber(event)" required>
function isNumber(evt) {
    evt = (evt) ? evt : window.event;
    var charCode = (evt.which) ? evt.which : evt.keyCode;
    if (charCode > 31 && (charCode < 49 || charCode > 53)) {
        return false;
    }
    return true;
}

最佳答案

您可以使用 Node.nextElementSibling 查找下一个元素然后使用 HTMLElement.focus() 分配焦点

要使其迭代到下一行,您必须检查当前焦点元素是否是当前行中的最后一个元素。如果是这样,则移至下一行。

最好在Element.onkeydown属性中使用Event.preventDefault(),然后检查该元素是否已填充到Element中.onkeyup 属性,因为 keypress 事件在按下按键时和释放按键时都会触发。

var validChar;
var inputs = document.querySelectorAll('td input[type=text]'), i;
for(i = inputs.length - 1; i >= 0; i--) {
    inputs[i].onkeydown = checkNumber;
    inputs[i].onkeyup   = checkFilled;
}
function checkNumber(event) {
    event = (event) ? event : window.event;
    var charCode = (event.which) ? event.which : event.keyCode;
    if (!(charCode >= 48 && charCode <= 53) 
     && !(charCode >= 96 && charCode <= 101)
     && !(charCode == 16 || charCode == 9)) {
            event.preventDefault();
            return false;
    } else if(!(charCode == 16 || charCode == 9)) {
        validChar = true;
    }
}
function checkFilled(event) {
    if(validChar && event.target.value.length === 1) {
        validChar = false;
        nextInput(event.target.parentNode);
    }
}
function nextInput(el) {
    if(el.nextElementSibling) {
        if(!el.nextElementSibling.firstElementChild) {
            nextInput(el.nextElementSibling);
            return false;
        }
        var nextSibling = el.nextElementSibling.firstElementChild;
    } else {
        if(!el.parentNode.nextElementSibling) {
            return false;
        }
        var nextRow = el.parentNode.nextElementSibling;
        if(!nextRow.firstElementChild.firstElementChild) {
            nextInput(nextRow.firstElementChild);
            return false;
        }
        var nextSibling = nextRow.firstElementChild.firstElementChild;
    }
    var nextType = nextSibling.tagName.toLowerCase();
    if(nextType !== "input") {
        nextInput(nextSibling);
        return false;
    }
    nextSibling.focus();
}
<table>
     <tr>
         <td>some text</td>
         <td>some text</td>
         <td><input type="text" maxlength="1" required></td>
         <td><input type="text" maxlength="1" required></td>
         <td><input type="text" maxlength="1" required></td>
         <td><input type="text" maxlength="1" required></td>
     </tr>
     <tr>
         <td>some text</td>
         <td>some text</td>
         <td><input type="text" maxlength="1" required></td>
         <td><input type="text" maxlength="1" required></td>
         <td><input type="text" maxlength="1" required></td>
         <td><input type="text" maxlength="1" required></td>
     </tr>
</table>

关于javascript - 如果验证函数返回 true,则聚焦下一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31212837/

相关文章:

javascript - jQuery AJAX 无法识别更新的 div 类

html - 多个元素向左浮动,一个元素向右浮动的 CSS 问题

javascript - 如何使用 PHP 中动态创建的按钮更改数据库值

jquery - 我的 jQuery 动画不工作,即使我发现 jQuery 部分代码没有问题

javascript - 什么是 Assets ,什么是 bundle

javascript - 根据for循环的输出更改div颜色

javascript - 在文章中心垂直对齐图像/按钮(父标签)

javascript - 如何知道在一组动态生成的选项卡中选择并激活了哪个选项卡

php - 使用ajax为每个输入字段更新mysql中的数据

javascript - 将自定义语言文件添加到 CKEditor