javascript - 什么是 FORM 等同于 DOM 的 getNextSibling?

标签 javascript forms dom

我有一个表格,如下:

<FORM name="form1">
    <TABLE onkeypress="focusNextFormElement(event)">
        <TR>
            <TD><INPUT name="SomeObscureName"></TD><TD>Some data</TD>
        </TR>
        <TR>
            <TD><INPUT name="ThisName"><span>Here's some obscure text.</span></TD><TD>Some data</TD>
        </TR>
        <TR>
            <TD><INPUT name="someNameIdontKnow"></TD><TD>Some data</TD>
        </TR>
    </TABLE>
</FORM>

有没有更好、更高效的方法来编写这个函数? (当然,这是一个简化的例子)

function focusNextFormElement(ev){
    var el = ev.target;
    var f = el.form;
    var xx = f.elements.length - 1;
    for(var x = 0; x < xx; x++){
        if(f.elements[x] === el){
            f.elements[x+1].focus();
        }
    }
}

此表单上可能有数千个元素,我认为每次函数运行时循环遍历它们并不是特别有效。

另外,我可以用我的鼠标任意选择一个输入,所以跟踪阵列可能没有多大用处。

我无法控制页面的生成,因为它是一个帮助另一个页面自动化的 greasemonkey 脚本。

编辑 感谢@Trincot,从更广泛的 Angular 来看,感谢@Oriol,找到了答案。

function nextFormSibling(el){
    var elems = el.form.elements;
    var idx = [].indexOf.call(elems, el);
    return elems[idx+1] || el;
}

function previousFormSibling(el){
    var elems = el.form.elements;
    var idx = [].indexOf.call(elems, el);
    return elems[idx-1] || el;
}

最佳答案

您可以在表单的元素集合上调用 indexOf() 获取元素的索引。尽管此集合不是原生 JavaScript 数组,但您可以像这样使用 indexOf.call:

function nextFormElement(el) {
    var f = el.form;
    if (f) return f.elements[1+[].indexOf.call(f.elements, el)];
}

这是一个演示片段,它使用此函数在单击表单元素时将焦点移动到下一个元素。这显然毫无用处,但它表明它有效:

function nextFormElement(el) {
    var f = el.form;
    if (f) return f.elements[1+[].indexOf.call(f.elements, el)];
}

function focusNextFormElement(ev){
    var el = nextFormElement(ev.target);
    if (el) el.focus();
}

document.querySelector('form').onclick = focusNextFormElement;
<FORM name="form1">
    <TABLE onkeypress="focusNextFormElement(event)">
        <TR>
            <TD><INPUT name="SomeObscureName"></TD><TD>Some data</TD>
        </TR>
        <TR>
            <TD><INPUT name="ThisName"><span>Here's some obscure text.</span></TD><TD>Some data</TD>
        </TR>
        <TR>
            <TD><INPUT name="someNameIdontKnow"></TD><TD>Some data</TD>
        </TR>
    </TABLE>
</FORM>

关于javascript - 什么是 FORM 等同于 DOM 的 getNextSibling?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35818082/

相关文章:

JavaScript HTML 表单 : unicode user input to unicode output

jQuery 根据下拉菜单中选择的数字动态创建输入字段?

javascript - 在导航样式上使用 getElementById?

javascript - JS/DOM 中不可见的 TextNode

javascript - 通过动态属性值选择Polymer元素

javascript - JQuery 滚动到类的下一个实例

javascript - 将数据参数从 parent 传递给 child

javascript - jquery:如何删除前一个元素?

javascript - 确保文本字段以特定值 : jQuery 开头

javascript - 根据 DOM 加载的文本更改文本区域高度