Javascript 如何选择第一个子表单元素(使用原型)?

Javascript 如何选择第一个子表单元素(使用原型)?,javascript,prototypejs,Javascript,Prototypejs,我想使用Prototype提供给我的东西或纯javascript将焦点设置在div中的第一个表单元素上。我有一个对包含表单元素的div的引用。我不知道第一个表单元素是、还是节点 我想这样做: $('parentDiv').down('textarea, select, input').focus(); 然而,该方法似乎选择了第一个textarea节点,即使在textarea之前有一个输入节点 有没有优雅的方法?我想我可以得到父div的所有子代,然后在每个子代上迭代寻找这些节点中的一个,但我怀疑

我想使用Prototype提供给我的东西或纯javascript将焦点设置在div中的第一个表单元素上。我有一个对包含表单元素的div的引用。我不知道第一个表单元素是
还是
节点

我想这样做:

$('parentDiv').down('textarea, select, input').focus();
然而,该方法似乎选择了第一个textarea节点,即使在textarea之前有一个输入节点

有没有优雅的方法?我想我可以得到父div的所有子代,然后在每个子代上迭代寻找这些节点中的一个,但我怀疑在原型中可能有一种很酷的方法来实现这一点

我不能使用表单对象的方法,因为这个父div只是表单的一部分。它是通过AJAX调用添加到页面中的,因此当div被添加到DOM中时,我希望将焦点设置在新添加的集合中的第一个字段上(这很可能不是整个表单中的第一个字段)


谢谢

当我使用prototype时,我肯定我做过类似的事情

var firstElement = Form.findFirstElement(document.forms[0]);
if(firstElement !=null)
    firstElement.activate();
我将用您的表格替换
文档。表格[0]

Prototype在
表单
类上也有
focusFirstElement
的方法,但我不能使用它,因为我要加载的一些页面没有表单。您可能只需要调用
Form.focusFirstElement($(Form))或类似的变体

编辑:
我认为您可以在不同类型的元素上使用表单扩展,但它似乎不起作用,但是您可以从表单中获取一些内容并直接应用它。下面的代码应该按照您的意愿工作

var firstElement = Form.getElements($("parentDiv")).find(function(element) {
    return element.type != 'hidden' && !element.disabled &&
    ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
});
if(firstElement != null)
    firstElement.activate();

Had与pkeading完全相同的问题-可以证实Quintin Robinson编辑的答案符合pkeading的要求

2注:

  • $(“parentDiv”)
    需要引用包含表单元素的div

  • 如果使用scriptaculous effects打开带有“子窗体”的div,则需要在效果中的afterFinish函数中运行代码:

    Effect.BlindDown(*YourDiv*,{
        duration:0.5,
        afterFinish: function() {
            var ff1=Form.getElements($(*YourDiv*)).find(
                    function(element){
                       return element.type != 'hidden' && !element.disabled && ['input', 'select', 'textarea'].include(element.tagName.toLowerCase())
                    }
            );
            if(ff1 != null) ff1.activate();
        }
    });
    

  • 这种方法的问题是我不想将焦点设置在表单中的第一个字段上,而是设置在表单中div中的第一个字段上。我在问题中补充了这一点的澄清。