したがって、これの短いバージョンは次のとおりです。セレクターの一致した要素内の要素のみを走査できますeach()
か? each()
または、ループなしで必要なものを取得する簡単な方法はありますか?
これははるかに簡単だと思ったので、jqueryで要素をトラバースするという基本的な原則が欠けているだけだと思います。
シナリオは次のとおりです。
各セルにテキストがあるテーブルがあります(この場合は適切です)input
。最後の入力は読み取り専用で、その行に入力された他の値の合計と見なされます。各行の合計と、各行の合計の総計の両方を見つけるための非常に厄介な js スクリプトがあります。
基本的な HTML は次のとおりです。
<table>
<thead>
<tr><th>Col 1</th><th>Col 2</th><th>Col 3</th><th>Total</th></tr>
</thead>
<tbody>
<tr id="row1"><td><input type="text" /></td><td><input type="text" /></td><td><input type="text" /></td><td class="total"><input type="text" readonly="readonly" /></td></tr>
<tr id="row2"><td><input type="text" /></td><td><input type="text" /></td><td><input type="text" /></td><td class="total"><input type="text" readonly="readonly" /></td></tr>
<tr id="row3"><td><input type="text" /></td><td><input type="text" /></td><td><input type="text" /></td><td class="total"><input type="text" readonly="readonly" /></td></tr>
</tbody>
</table>
明確にするために、javascript は、入力されたデータが数値であることを検証します。
onchange
そのため、ユーザーがデータを入力して次のセル/入力に移動したときに合計を更新するための各入力のイベントリスナーがあります。次にupdateTotal
、現在for
ループを使用して各行をループし、そのループ内で各セルをループし、最終的に合計セルの入力を合計するように設定する関数を呼び出します。
簡単なメモ: 以下のコードを含めたのは、私が手渡しを探しているだけではないことを示し、私が考えていることの基本的なロジックを示すためです。この部分は読み飛ばしたりスキップしたりしてください。それは機能し、デバッグや批評は必要ありません。
これは次のようになります。
function updateTotal() {
table = document.getElementsByTagName("tbody")[0];
allrows = table.getElementsByTagName("tr");
grandtotal = document.getElementById("grand");
grandtotal.value = "";
for (i = 0; i < allrows.length; i++) {
row_cells = allrows[i].getElementsByTagName("input");
row_total = allrows[i].getElementsByTagName("input")[allrows.length - 2];
row_total.value = "";
for (ii = 0; ii < row_cells.length - 1; ii++) {
row_total.value = Number(row_total.value) + Number(row_cells[i][ii].value);
grandtotal.value = Number(grandtotal.value) + Number(row_cells[i][ii].value);
}
}
}
今、私は上記をjquery構文で書き直そうとしていますが、行き詰まっています。each()
最善の方法は、次の行に沿ってループを使用することだと思いました。
function findTotals() {
$("tbody tr").each(function() {
row_total = 0;
$($(this) + " td:not(.total) input:text").each(function() {
row_total += Number($(this).val());
});
$($(this) + " .total :input:text").val(row_total);
});
}
しかし、$(this)
思ったように使えないようです。私は読ん$(this)
で、各ループでの使用が一致した各要素を指していることを見ました。上記では、grand_total ビットも省略されています。これは、総計変数を機能させるのにさらに運が悪かったためです。row_totals を取得するためだけに次のことを試しました。
$($(this).attr("id") + " td:not(.total) input:text").each(function() {
ある程度成功しましたが、追加しようとしたときになんとか壊れました。各部分は私が考えている行を指す必要があるため、これを機能させるために各行にIDを付ける必要はないと思います。
したがって、これの短いバージョンは次のとおりです。各ループを使用して、一致する要素のみをトラバースできますか?もしそうなら、正しい構文は何ですか? または、各ループなしで必要なものを取得する簡単な方法はありますか?
ああ、最後にもう 1 つ考えました...
jqueryを使用して、一致したすべての要素の数値合計(1つの長い文字列ではなく)を取得することは可能ですか? 私はこれを自分でもっと研究しますが、誰かが知っていれば、これのいくつかはずっと簡単になります.