0

すべてのIDとクラスを自動的に書き込むDrupalのWebformモジュールを使用しているため、追加したい場所にIDを追加できません。そして、Drupalは私のためにそれを入れません。Grrr。

単純な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 に答える