Javascript DOM帮助,父母的父母,孩子的孩子

Javascript DOM帮助,父母的父母,孩子的孩子,javascript,Javascript,我正在使用Drupal的Webform模块,它会自动写入所有Id和类,因此我无法将Id添加到我想要添加的位置。而且Drupal没有为我放一个。Grrr 当我只使用一个简单的getElementById('myid')来使用代码时,我没有问题,但是我需要的元素是一个空白的、没有id的、没有类“a”,它位于一个带有id的字段集中的“legend”(有类但没有id) 我尝试了这段代码和几个变体,但没有成功: document.getElementById('webform-created-id-her

我正在使用Drupal的Webform模块,它会自动写入所有Id和类,因此我无法将Id添加到我想要添加的位置。而且Drupal没有为我放一个。Grrr

当我只使用一个简单的getElementById('myid')来使用代码时,我没有问题,但是我需要的元素是一个空白的、没有id的、没有类“a”,它位于一个带有id的字段集中的“legend”(有类但没有id)

我尝试了这段代码和几个变体,但没有成功:

document.getElementById('webform-created-id-here').getElementsByTagName('legend').getElementsByTagName('a');
我觉得我不明白如何正确访问DOM的这一部分。有人能提供帮助或建议吗


谢谢大家!

getElementsByTagName返回包含找到的元素的节点列表,因此必须选择元素的索引

第一个元素的示例

var test = document.getElementById('webform-created-id-here').getElementsByTagName('legend')[0].getElementsByTagName('a')[0];

自己在DOM中递归。对任何元素的子元素的引用都存储在
childNodes
属性中,该属性存在于每个节点中

function recurseDOM (el,test) {
    if (test(el)) {
        return el;
    }
    else {
        var children = el.childNodes;
        var result;
        for (var i=0; i<children.length; i+) {
            result = recurseDOM(children[i],test);
            if (result) {
                return result;
            }
        }
    }
    return null;
}
您可以编写类似的函数来测试父级:

function testParents (el, test) {
    var parent = el.parentNode;

    if (test(parent)) {
        return 1;
    }
    else {
        if (parent != document.body) {
            return testParents(parent,test);
        }
    }
    return 0;
}
所以你可以写这样的东西:

recurseDOM(document.body,function(el){
    if (el.tagName == 'a' && testParents(el,function(p){
        if (p.tagName == 'legend' && testParents(p,function(pp){
            if (pp.id == 'webform-created-id-here') {
                return 1;
            }
            return 0;
        })) {
            return 1;
        }
        return 0;
    })) {
        return 1;
    }
    return 0;
});

或者,您可以从
getElementById
而不是
document.body

启动递归,这看起来与我需要的完全一样,但仍然不起作用。有没有办法确定它是否真的是“[0]”?因为它可能不是…发布HTML,然后我们可以告诉你它应该是什么。但是,如果指定类型只有一个子项,则它将是[0]。您必须根据元素中的“a”顺序选择索引,并在@Barmar have write中发布该html部分
recurseDOM(document.body,function(el){
    if (el.tagName == 'a' && testParents(el,function(p){
        if (p.tagName == 'legend' && testParents(p,function(pp){
            if (pp.id == 'webform-created-id-here') {
                return 1;
            }
            return 0;
        })) {
            return 1;
        }
        return 0;
    })) {
        return 1;
    }
    return 0;
});