2010-12-12 10 views
2

私は、次のコードを持っているツールチップ内のテーブルといくつかの中でいくつかのページ上の複数回を置い:jQueryの - ループのラベル/入力ペアを通じて、ユニークなIDを追加

<p class="radioBtn"> 
    <label for="business"></label> 
    <input id="business" type="radio" name="radioBtn" value="" /> 
</p> 
<p class="radioBtn">  
    <label for="private"></label> 
    <input id="private" type="radio" name="radioBtn" value="" /> 
</p> 

私はどのように知っていただきたいと思い、 jQueryを使って、私はページ全体をループし、 'for'属性のラベルと一意のID番号を入力して、 'id'を入力することで、次のようにそれぞれのペアリングに固有の何かを得ることができます:

<p class="radioBtn"> 
    <label for="business0"></label> 
    <input id="business0" type="radio" name="radioBtn" value="" /> 
</p> 
<p class="radioBtn">  
    <label for="private0"></label> 
    <input id="private0" type="radio" name="radioBtn" value="" /> 
</p> 

事前に感謝します。

+0

'input'と' label'要素の比率は1:1ですか? –

+0

@Davidはいあります。最終的にペアはデータベースから追​​加されるので、いつでも最大100のペアリングが可能です。 'for'と 'id'は、JSを使用して外観を変更するときと同じにする必要があります。 – mtwallet

答えて

3

後期の回答を参照してください

$(function(){ 
    $("input:radio[name='radioBtn']").each(function(index){ 
     var currElem = $(this); 
     var prevLabel = currElem.prev(); 
     currElem.attr("id", this.id + index); 

     prevLabel.attr("for", prevLabel.attr("for") + index); 
    });  
}); 

を試してみてください、しかし、jQueryのを使用して、私はおそらくより、このようにそれを行うだろう:

$("input:radio[name=radioBtn]").attr('id',function(index,id){ 
    $(this).prev()[0].htmlFor += index; 
    return id += index; 
}); 

少ないコード、おそらくより良いパフォーマンス。

説明すると、.attr()は、設定している値の関数を受け入れることができます。戻り値は属性の新しい値になります。

この関数では、最初のパラメータは反復の現在の項目のインデックスであり、2番目のパラメータは設定されている属性の現在の値です(この場合はid)。

だから、関数の本体はこのように書きます:

  • $(this).prev()jQuery's .prev()を使用して、前の要素を取得します。
  • [0] DOM要素をjQueryオブジェクトから引き出します。 <label>
  • ラベルのhtmlForプロパティを+=の現在のインデックスに設定します。
  • 現在のインデックス+=を返します。
+0

これは素晴らしい答えです。私は理解ポイント2を完全に理解していません。DOM要素を[0]で引き出します。もう少し説明していただけますか? – mtwallet

+0

@mtwallet:jQueryオブジェクトは、DOM要素のコレクションであり、複数のメソッドがあります。配列の場合と同様に、これらの要素に '[]'(大括弧の表記法)を使ってインデックスでアクセスすることができます。だから '$(this)'では、 'radio'を含むオブジェクトがあります。 '.prev()'では、オブジェクトは 'radio'の前に要素を含みます。 '[0]'を使用すると、その要素を(インデックス0の)jQueryオブジェクトから取得します。これでネイティブのDOM要素が得られました。ネイティブ 'htmlFor'プロパティを使うことができます。ここで' .attr( 'for')を一度呼び出すのではなく 'for =もう一度設定してください。 – user113716

+0

返信いただきありがとうございます、それは完璧な意味合いです。私は助けに感謝します。 – mtwallet

1

このような何か:

$('label').each(function(index) { 
    var forAttr = $(this).attr('for'); 
    $next = $(this).next(); 
    if($next.attr('id') == forAttr) { 
     $(this).attr('for', forAttr + index); 
     $next.attr('id', forAttr + index); 
    } 
}); 

を、サーバー側でこれを行うには良いだろうけど。

+0

これはうまく動作します、私は助けていただきありがとうございます。 – mtwallet

+0

ここで何が起こっているのか説明できるかどうか疑問に思います。どのように要素をループしているのか理解していますが、関数の 'インデックス'部分は何ですか? – mtwallet

+0

@mtwallet、 'index'は、現在ループしているセット内の要素の番号です。最初のラベルは0のインデックスを持ち、2番目には1などがあります。マニュアルを見てください:http://api.jquery.com/jQuery.each/ –

1
+0

これは多くのおかげで素晴らしい作品です。関数の 'インデックス'部分が何をしているのか説明してください。 – mtwallet

+0

'index'は'の '現在の反復インデックスを取得します。each() 'function – rahul

関連する問題