私はリピーターにテーブルを持っています。データはテーブルに入力され、ロードされるデータのタイプに応じて各行にクラスが割り当てられます。例えば:
<table id="detail-table">
<tr class="typeA">
<td>Value</td>
</tr>
<tr class="typeB">
<td>Value</td>
</tr>
<tr class="typeC">
<td>Value</td>
</tr>
<tr class="typeB">
<td>Value</td>
</tr>
<tr class="typeA">
<td>Value</td>
</tr>
</table>
表は折りたたまれた表です。 typeAはヘッダー、typeBはtypeAの子、typeCはtypeBの子です。表の例では、typeAには2つの直接の子があり、最初の子にも子があります。
ユーザーがtypeAをクリックすると、2つのtypeB行が表示され、typeBに子がある場合は、typeC行が表示されるように展開されます。私はクリックでこれを行うイベントハンドラを持っています。
私は特定の値を持つ項目の完全な詳細展開(typeAにtypeC)を適用する必要があります。 typeAのセルの値がクエリ文字列から受け取った値と等しい場合、親とその親のすべての子に対してexpandイベントをトリガーする必要があります。私はすでにこれを行ういくつかのコードを持っています。しかし、私はそれがちょっとしたハックだと感じています。誰かに何か提案があったかどうか疑問に思っていましたか?ここまで私がこれまで持っていたことがあります。
$(function() {
var tableRows = $('#detail-table').find("tr:gt(0)");
$(tableRows).each(function(i, val) {
//ExpandValue is a value in my C# page.
if ($.trim(val.cells[0].innerText) == '<%= ExpandValue %>'){
expandRows(i);
}
}
function expandRows(startIndex) {
//Expand the first row, the typeA class
//row that matches the value
$(tableRows[startIndex]).trigger('expand');
startIndex += 1;
while($(tableRows[startIndex]).attr("class") != "typeA"){
$(tableRows[startIndex]).trigger('expand');
startIndex++;
}
}
});
これにより、テーブルのすべての行が検索されます。次に、テーブル行の配列をループします。条件は、各行の最初のセルのinnerTextをチェックします。セルのinnerTextがExpandValueと一致する場合、ターゲット行が見つかりました。この行のインデックスをexpandRows関数に送信します。 expandRows関数では、startIndexの行を展開します。これはExpandValueと一致するtypeAクラスの行です。次にstartIndexを1だけインクリメントして次の行をポイントします。 whileループは各行のクラスをチェックします。次のtypeA行がヒットするまで、各行のexpandイベントをトリガーします。これは正しく動作し、各行を正しく展開します。しかし、もう一度、私はjqueryの新人です、そして、私はこれをより良い方法で達成するための多分方法があると感じます。何か案は?