2011-06-09 17 views
1

1番目のセルと最後の3の間のテーブルから行番号が不明(変更)になります。それぞれjQueryを使用しています。なぜ$(this).lengthがインデックスの全長を与えないのかを知っている。それぞれのインデックスの合計長さを取得する

のjQuery:

$("#parent table:first tr").each(function(i){ 
    var goodlng = $(this).parent().children("tr").length -1; //this works 
    var badlng = $(this).length -1;      //this doesn't! (always == -1) 
}); 

goodlngをお勧めしますか?それは親に行って子供に戻らなければならないようなハックのようだ。 ここにはjsfiddle(console.log()を持っている)があります。

例HTML:

<div id="parent"> 
    <table> 
     <tr> 
      <td>unwanted 1</td> 
     </tr> 
     <tr> 
      <td>wanted!</td> 
     </tr> 
     <tr> 
      <td>unwanted2</td> 
     </tr> 
    </table> 
</div> 

TL; DR:なぜ、各関数の内部ではない$(this).length == $(this).parent().children("tr").lengthありません。これを行うもう一つの良い方法があります。

答えて

1

あなたの質問には「セル」と書かれていますが、行数を取得しようとしているようです。

実際に.each()の内部に入れたい場合は、siblings()[docs]メソッドとandSelf()[docs]メソッドを使用できます。

$(this).siblings().andSelf().length 

しかし、行が変更されていない場合、それはなぜ繰り返しですか?

変更されている場合は、表のネイティブrowsプロパティを使用して長さを取得します。

var table = $("#parent table:first"); 

table.find('tr').each(function() { 

    var len = table[0].rows.length; 

}); 
+0

whoopsは行感謝!私は前に '兄弟()'を試みたが、 'andSelf()'については知らなかった。それはより良い練習ですか?それとも本当に重要なのですか? – mazlix

+0

@ mazlix:私はちょうど私の答えを更新しました。 'table'への参照を保持し、' rows'プロパティの 'length'を取得することで、jQueryを使用するオーバーヘッドをなくすことができます。これははるかに高速になります。 – user113716

+0

...行が何らかの操作をしなければならないと仮定します。そうしないと、 '.each()'の外側で量をキャッシュする方が良いでしょう。 – user113716

0

each()関数は、現在処理している要素の集合を認識しません。常に単一の要素を扱っています。そういうわけで、あなたが親に行き、すべての子供たちに尋ねるとき、あなたは正解を得るのです。

$(this) 

は、あなたが扱っている現在のtr要素を単に参照し、それらのコレクションは参照しません。

1

実際には、この$(this).parent().children("tr").lengthが正しい処理方法です。 thisは、ノード自体の参照である。 tr .length = trの長さ。一方、tr.parent().children("tr")は、ノードの兄弟のリストであるため、tr.parent().children("tr").lengthは兄弟の数です。

1

これは、すべての要素ではなく、各要素のコンテキストです。したがって、thisは一度に1つだけtrです。長さがすべての要素を持っていないのはそのためです。

関連する問題