0

我正在使用 Drupal 的 Webform 模块,它会自动写入所有 id 和类,所以我无法将 Id 添加到我想要添加它的地方。Drupal 并没有为我添加一个。嗯。

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

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

document.getElementById('webform-created-id-here').getElementsByTagName('legend').getElementsByTagName('a');

我觉得我不明白如何正确访问 DOM 的那一部分。任何人都可以提供帮助或建议吗?

谢谢!

4

2 回答 2

0

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

第一个元素的示例

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

演示视图

于 2013-03-08T21:32:04.287 回答
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;
}

这只是我在输入此答案的 2 分钟内编写的一种可能的实现。所以它可能会使用一些改进。但你明白了。

像这样使用它:

recurseDOM(document.body,function(el){
    if (el == something_something) { return 1}
    return 0
});

你可以编写一个类似的函数来测试父母:

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.

于 2013-03-08T23:59:38.240 回答