与えられたidを持つ要素が1つだけあるべきです。あなたがその状況に悩まされているなら、オプションの私の答えの後半を見てください。
同じID(違法HTML)を持つ複数の要素が仕様で定義されていない場合、ブラウザの動作はどのようになりますか?すべてのブラウザをテストして、その動作を調べることができますが、この設定を使用することや、特定の動作に依存することは賢明ではありません。
複数のオブジェクトで同じ識別子を使用する場合は、クラスを使用します。
<div>
<span class="a">1</span>
<span class="a">2</span>
<span>3</span>
</div>
$(function() {
var w = $("div");
console.log($(".a").length); // 2
console.log($("body .a").length); // 2
console.log($(".a", w).length); // 2
});
あなたが確実に同じIDを持つ要素を見たい場合は、文書を修正することはできませんので、あなたがDOMに建てられたの任意のに頼ることができないとして、あなたはあなた自身の繰り返しを行う必要があります機能。
あなたはこのようにそれを行うことができます:
function findMultiID(id) {
var results = [];
var children = $("div").get(0).children;
for (var i = 0; i < children.length; i++) {
if (children[i].id == id) {
results.push(children[i]);
}
}
return(results);
}
それとも、jQueryの使用:
$("div *").filter(function() {return(this.id == "a");});
jQueryの作業例:http://jsfiddle.net/jfriend00/XY2tX/を。
なぜ異なる結果になるのかについては、実際のセレクタ操作を実行していたコードの内部実装と関係があります。 jQueryでは、特定のバージョンが何をしているのかを調べるためにコードを調べることができますが、これは違法なHTMLなので、時間の経過とともに同じままになるという保証はありません。 jQueryで見たことから、セレクタが#a
のような単純なIDであるかどうかを確認し、その場合はdocument.getElementById("a")
を使用します。セレクタがそれより複雑でquerySelectorAll()
が存在する場合、jQueryはセレクタを組み込みのブラウザ関数に渡します。この関数は、そのブラウザ固有の実装を持ちます。 querySelectorAll()
が存在しない場合は、Sizzleセレクタエンジンを使用して、独自の実装を持つセレクタを手動で検索します。したがって、正確なセレクタとブラウザの新しさに応じて、同じブラウザファミリ内に少なくとも3つの異なる実装を持つことができます。次に、個々のブラウザにはそれぞれ独自のquerySelectorAll()
実装があります。このような状況に確実に対処したい場合は、上に示したように独自の反復コードを使用する必要があります。
あなたは**注を説明してくださいでした:
JSfiddleを試してみてください。ここで
はあなたのコードのためのソリューションですか?タグセレクタを追加すると便利なのはいつですか? –@Misha Moroshko - 可能な限り、タグセレクタを含める必要があります。これは、タグセレクタが属性セレクタよりもはるかに効率的であるためです。属性セレクタをタグセレクタで修飾すると、jQueryはまずタグセレクタを使用してそのタグを持つ要素を見つけ、それらの要素に対してのみ属性セレクタを実行します。これははるかに効率的です。 –
私は 'div#some_id'が'#some_id'より遅いことをここで見ています:http://stackoverflow.com/q/7262116/247243 –