2012-02-10 61 views
1

jqueryでビルドセレクタ文字列の代替手段はありますか?Jquery:ビルドセレクタ文字列の代わりに?

特に、いくつかのフォーム要素のラベルから情報を抽出しようとしているため、$('[for=#id]')のようなクエリを作成する必要があります。フォーム要素のすべての反復のすべてのパスでクエリ文字列を作成しなければならないのは、控えめで(おそらく非効率的な)ようです。

私が見つけることができる唯一の類似した質問は、有用な答えを持たないjQuery (anti-)pattern: building selectors with string manipulationです。

+0

これは、反復処理中のフォーム要素を基準にしてラベルを選択することができます。たとえば、ラベルがフォーム要素の直前にある場合は、単にelement.prev()を使用することができます。 –

+0

私は、あなたが何を望んでいるかのコンテキストに問題があります。 ? – mcgrailm

答えて

1

少なくとも、あなたが探しているフォームに検索を限定してください。属性の検索は、要素のルートセット内のすべての要素を反復処理する必要があるため、非効率的です。その代わりに、DOM内のすべての要素を検索すると、検索を制限します。

var forID = $('#my-form').find('[for=#id]'); 

あなたがしたいだけで何にダウンフィルタリング、その後、フォーム内のラベルを検索することで、このビットを高速化することができます。

var $allLabels = $('#my-form').find('label'); 

//then you can find a specific element by searching in the $allLabels object. 
$allLabels.filter('[for="#id"]'); 

ラベルが動的に変更されない場合は、選択範囲をループ外にキャッシュする必要があります。常にループ内で変更されない値をループ外にキャッシュします。

+0

ありがとうございます。私は多くのコードを最適化するつもりです。 – Marcin

+0

また、その2行目では、正しい構文ですか?もしそうなら、素晴らしい。 – Marcin

+0

@Marcin私はあなたが 'var $ allLabels = $( '#my-form')を意味すると仮定しています。find( 'label');'。これは非常に高速なidでフォームを選択することから始まり、フォーム内のすべての 'label'要素を見つけます。これは' getElementByTagName'を持つブラウザでは非常に高速です。これらの 'label'要素は' $ allLabels'変数を使用して後でアクセスできます。 '$ allLabels'変数内で単一のラベルまたはラベルのグループを見つけるには、ネストされた要素ではなく要素のリストがあるので、' .find() 'の代わりに' .filter() 'を使う必要があることに注意してください'.find()'は子孫を検索します)。 – Jasper

0

毎回各要素を処理する必要がある場合は、クエリを1回実行して結果を変数に格納するだけで済みます。これらの要素の情報を抽出する必要があるときはいつでも、その変数のすべてを繰り返し処理することができ、そのたびに要素のリストを照会する必要がなくなります。

関連する問題