用jQuery實現表格列的合計功能,當單元格的值發生變化時,合計行自動統計個單元格的值。
1.編寫html
1: <table id="table-fund">
2: <caption class="table-caption-legend">
3: (單位:萬元)</caption>
4: <thead>
5: <tr>
6: <th colspan="3">經費到位情況</th>
7: </tr>
8: <tr>
9: <th>科目
10: </th>
11: <th>預算數</th>
12: <th>到位數</th>
13: </tr>
14: </thead>
15: <tr>
16: <td>1.省科技經費
17: </td>
18: <td>
19: <input id="SouProSciTech" type="text" />
20: </td>
21: <td>
22: <input id="ProSciTechAvailable" type="text" /></td>
23: </tr>
24: <tr>
25: <td>2.單位自籌
26: </td>
27: <td>
28: <input id="SouUnitSelfFinanc" type="text" />
29: </td>
30: <td>
31: <input id="UnitSelfFinancAvailable" type="text" /></td>
32: </tr>
33: <tr>
34: <td>3.銀行貸款
35: </td>
36: <td>
37: <input id="SouBankloans" type="text" />
38: </td>
39: <td>
40: <input id="BankloansAvailable" type="text" /></td>
41: </tr>
42: <tr>
43: <td>
44: <span class="totall">合</span><span class="totall">計</span>
45: </td>
46: <td>
47: <input id="TotalSou" readonly="readonly" type="text" />
48: </td>
49: <td>
50: <input id="TotalSouAvailable" readonly="readonly" type="text" />
51: </td>
52: </tr>
53: </table>
2. Script實現
2.1 為每個input綁定事件
實現在單元格值發生變化時,合計行的單元格的值自行發生變化,這里采用.each()遍歷input並為其綁定函數keyup(這里不采用change),在keyup事件發生時進行合計。
1: $("#table-fund tr").each(function () {
2: $(this).find("td:eq(1) input:not(#TotalSou)").keyup(function () {
3: totalSouFund();//調用合計方法
4: });
5: });
這里遍歷除統計單元格之外的每個input,以上代碼遍歷第二列的輸入框,在:not()中排除合計單元格的input。在input的keyup觸發時調用合計方法。
2.2 實現合計
1: function totalSouFund() {
2: totalSou = 0;
3: $("#table-fund tr").each(function () {
4: $(this).find("td:eq(1) input:not(#TotalSou)").each(function () {
5: totalSou += getNumValue($(this)) ;
6: $("#TotalSou").val(Number(totalSou.toFixed(4)));
7: });
8: });
9: }
(1) totalSou用來存儲合計值,在每次調用該函數時把totalSou置0,然后遍歷每個單元格中的值進行累加;
(2) getNumValue()用來獲取文本框的值,返回float;
1: function getNumValue(controlid) {
2: /// <summary>
3: /// Get a number from input tag which type is text
4: /// </summary>
5: /// <param name="controlid">id of input control</param>
6: /// <returns type="">float or 0</returns>
7: var num = controlid.val();
8: if (validateInput(num)) {
9: num = parseFloat(num);
10: }
11: else {
12: controlid.val("");
13: num = 0;
14: }
15: return num;
16: }
(2.1) validateInput() 返回一個Bool值用來驗證輸入的值是否有效,確保getNumValue返回一個有效數值
1: function validateInput(inputstr) {
2: /// <summary>
3: /// validate a value
4: /// </summary>
5: /// <param name="inputstr"></param>
6: /// <returns type="">bool</returns>
7: flag = false;
8: if (inputstr != "") {
9: if (isNaN(inputstr)) {
10: flag = false; //如果輸入字符不是數字
11: }
12: else {//輸入數字但是小於0
13: if (parseFloat(inputstr) < 0)
14: flag = false;
15: else
16: flag = true;
17: }
18: }
19: return flag;
20: }
2.3 處理javaScript中浮點數計算的出現的問題
1: $("#TotalSou").val(Number(totalSou.toFixed(4)));
注:這里用Number(totalSou.toFixed(4))保留四位小數,但是其它單元格中輸入超過四位小數時在此並沒有做相應的處理。你也可以做進一改進,只傳入合計控件ID和列的索引值寫更少的代碼。
<summary>隨筆,若有不足之處和好的建議,歡迎交流學習}</summary>