0

別の要素識別子内の特定の要素を検索する関数を開発しています(getElementByIdに似ていますが、他の要素に適用されます)...これは私に不満を投げかけるためです:

var ancestor = document.getElementById('divAncestor');
var child = ancestor.getElementById('divChild');

HTMLは、IDが一意でなければならないと指定していますが、実際には、同じIDを持つアイテムを持つことができるスクリプトを頻繁に実行していることが証明されています。だから、それが私が単にこのように子供を呼んでいない理由です:

var ancestor = document.getElementById('divChild');

最初のオプションは、この関数を各HTML要素、または少なくともdivに追加することでした(それが私が興味を持っているものだからです)。2つ目は、私が好む方法ですが、domドキュメントにメソッドを追加し、そこから父と息子のIDをパラメーターとして渡すことで呼び出します。

これは可能ですか?

御時間ありがとうございます。

4

2 に答える 2

2

これを使って:

document.querySelector("div#divAncestor div#divChild");

これは、withの最初のwithdivid="divChild"取得しますdivid="divAncestor"

IDは一意である必要がありますが、仕様に従って、一意でない可能性があります。
(ブラウザはそれをうまく処理します)
これを防ぐためにあなたの優先順位は「あるべき」ですが、上記のコードは機能します。

複数の祖先または子が存在する場合、これは機能するはずです。

document.querySelectorAll("div#divAncestor div#divChild");

フィドルの例

これらのquerySelectorsは、cssセレクターのように機能します。次のようなクラスを選択します:div.className、次のような複数の要素:div, p, h1など。

于 2012-12-14T15:07:43.547 に答える
1

一意でないIDでboshについて話し合うのではなく、実際の質問に答えます。

DOMドキュメントにメソッドを追加することは可能ですか?

はい、JSでDOMを拡張する方法を参照してください。しかし、それをしないでください!その理由は、Kangaxの記事「DOMの拡張の何が問題になっているのか」で非常によく説明されています。

2番目の方法は、domドキュメントにメソッドを追加し、そこから父と息子のIDをパラメーターとして渡すことによって呼び出すことでした。

あなたはこれを行うことができます、はい、そしてあまり害を引き起こさないでしょう。静的関数を使用すると、ガベージコレクションの問題などが発生しないため、すべてのブラウザでうまく機能すると思います。

それでも、私はそれをする正当な理由を見ることができません。変数を名前空間として悪用しているように聞こえdocumentますが、他のグローバル変数または名前空間オブジェクトも同様に悪用します。起こりうる(将来の)衝突を作成しないためには、専用の名前空間がより良い選択です。

于 2012-12-14T15:49:09.940 に答える