getAll メソッドはプライベートであり、操作モジュール内にあります。このコードには、次のような簡単な行が数行だけあります。
function getAll( elem ) {
if ( typeof elem.getElementsByTagName !== "未定義" ) {
return elem.getElementsByTagName( "*" ) {
} else if ( typeof elem.querySelectorAll; !== "未定義" ) {
return elem.querySelectorAll( "*" );
} else {
return []
}
}
このメソッドは関数名からわかります。 HTML要素に渡されたすべての子要素を取得するために使用されます。 3 つの内部分岐があります
1. まず、elem に getElementsByTagName メソッドがあるかどうかを確認し、ある場合は getElementsByTagName メソッドを使用してすべての子要素を取得します。
2. GetElementsByTagName はサポートされていません。次に、elem が querySelectorAll メソッドを使用して要素のサブ要素を取得できるかどうかを確認します。
3、getElementsByTagName と querySelectorAll はサポートされておらず、空の配列を返します。
このコードを見たとき、私は混乱し、2 番目の分岐が少し冗長であるように感じました。
1、getElementsByTagName は、
DOM レベル 2 (以前) の API です。すべてサポートされているため、2 番目の API を入力する必要はありません。 . 分岐して直接戻ります。次のコードは冗長ではないでしょうか?
2. querySelectorAll は
DOM レベル 3 (新しい) の API であり、IE6/7 ではサポートされていません。
これを見て、最後の 2 つのブランチが冗長だと思いますか? それとも冗長ではない理由を見つけることができますか? つまり、次の条件を満たす要素 ele を見つけるだけです。
「elem には getElementsByTagName メソッドはありませんが、querySelectorAll メソッドがあります。」
多くの検索の後、議論を通じて最終的に答えが見つかりました (Xiaoniu によって発見されました)。 DocumentFragment はこの条件を満たします。
var frag = document.createDocumentFragment();
alert('getElementsByTagName' in frag);
alert('querySelectorAll' in frag);
上記のコードは IE9/Chrome/Safari/Firefox で false として表示されます。 /オペラ、本当です。
この時点ではこれ以上の説明はありません。
注: DocumentFragment オブジェクトのいくつかの特別な点
1. IE6/7/8 には createElement メソッドがありますが、他のブラウザ (IE9/10/Safari/Chrome/Firefox/Opera) にはありません
2. IE9/10/Firefox/Safari/Chrome/OperaにはgetElementsByTagNameメソッドはありませんが、querySelectorAllメソッドはあります。
関連:
http://www.jb51.net/article/30352.htmhttps://developer.mozilla.org/en/DOM/document .createDocumentFragmenthttps://developer.mozilla.org/En/DOM/DocumentFragmenthttp://www.w3.org/TR/DOM-Level -3-Core/core.html#ID-B63ED1A3