それ以来、私はこれらの方法について多くの研究を行い、多くの機会に使用してきました。これらは多くのタスク (特に構造に関する抽象 DOM セレクター) で非常に役立つことが証明されています。
1. DOMElement.contains(DOMNode)
このメソッドは、DOM ノードが別の DOM 要素に含まれているかどうかを判断するために IE で初めて使用されました。
このメソッドは、CSS セレクターのトラバーサル (「#id1 #id2」など) を最適化する場合に役立ちます。 getElementById を介して要素を取得し、.contains() を使用して #id1 に実際に #id2 が含まれているかどうかを判断できます。
注: DOM ノードと DOM 要素が一貫している場合、要素にそれ自体を含めることはできませんが、 .contains() は true を返します。
これは、Internet Explorer、Firefox、Opera、Safari で実行できる単純な実行ラッパーです。
2. NodeA.compareDocumentPosition(NodeB)
このメソッドは DOM レベル 3 仕様の一部であり、2 つの DOM ノード間の相互の位置を決定できます。このメソッドは .contains() よりも強力です。このメソッドの応用例の 1 つは、DOM ノードを特定の正確な順序に並べ替えることです。
このメソッドを使用すると、要素の位置に関する一連の情報を決定できます。これらすべての情報はビット コード (ビット、バイナリ ビットとも呼ばれます) を返します。
それらについてはほとんど知られていません。ビットコードは複数のデータを単純な数値 (訳者注: 0 または 1) として格納します。個々の数値の最終的なオン/オフ (翻訳者注: オン/オフは 0/1 に対応します) により、最終的な結果が得られます。
<script> <br>alert( document.getElementById("a"). CompareDocumentPosition(document.getElementById(" b")) == 20); <br></script>
DOMNode.compareDocumentPosition が Firefox と Opera で利用できるようになりました。ただし、IE で実行するために使用できるトリックがいくつかあります。
// 位置の比較 - MIT Licensed、John Resig
function ComparePosition(a, b){
return a.compareDocumentPosition ?
a.compareDocumentPosition(b) :
a.contains
( a != b && a.contains( b) && 16)
( a != b && b.contains(a) && 8 )
( a.sourceIndex >= 0 && b.sourceIndex >= 0 ?
(a.sourceIndex < b .sourceIndex && 4 )
(a.sourceIndex > b.sourceIndex && 2 ) :
1 ) :
0;
IE には、使用できるメソッドとプロパティがいくつか用意されています。まず、 .contains() メソッド (前述したように) を使用して、 を含む (16) または含まれる (8) という結果を取得します。また、IE には、ドキュメント内の要素の位置に対応するすべての DOM 要素の .sourceIndex 属性があります (例: document.documentElement.sourceIndex == 0)。この情報があるため、前面 (2) と背面 (4) の 2 つのcompareDocumentPosition パズルを完了できます。さらに、要素が現在のドキュメントにない場合、.sourceIndex は -1 になり、別の答え (1) が得られます。最後に、このプロセスを外挿することにより、要素がそれ自体と等しい場合、空のビットコード (0) が返されることがわかります。
この機能は Internet Explorer、Firefox、Opera で動作します。ただし、Safari では機能が不完全です (contains() メソッドのみがあり、.sourceIndex 属性がないためです。取得できるのは contains (16)、is contains (8) のみであり、他のすべての結果は切断を表す (1) を返します) )。
PPK は、getElementsByTagNames メソッドを作成して新しい機能を利用できるようにする優れた例を提供します。これを新しいメソッドに適応させてみましょう:
/ / PPK quirksmode.org によるオリジナル
function getElementsByTagNames(list, elem) {
elem = elem document;
var tagNames = list.split(','), results = []; 🎜 >
for ( var i = 0; i var tags = elem.getElementsByTagName( tagNames[i] ); ; tags.length; j )
results.push( tags[j] );
return results.sort(function(a, b){
return 3 - (comparePosition) ( a, b) & 6);
}
これを使用して、次の順序でサイトのディレクトリを構築できます。 (" h1, h2, h3");
Firefox と Opera はこのメソッドを実装するためにいくつかの取り組みを行っています。私は、前進を支援するためにさらに多くのブラウザが登場することを今でも楽しみにしています