jquery學習之—構建功能型表單(二)

構建功能型表單(一) 中介紹了一些適用於用戶進行文本性輸入的表單功能。

然而,有時候表單中的內容也會以數字爲主。

當處理作爲表單內容的數字值時,也可以實現另外幾種表單增強功能。

 

數字表單的典型代表就是購物車。在購物車表單中,應該允許用戶更新購買的商品數量,同時,也要爲用戶提供價格和總金額的數字反饋。

 

構建功能行表單(二)


1.在操作表單前先爲表格應用標準的行條紋效果,美化一下表格的外觀

Js代碼 複製代碼
  1. var stripe = function(){   
  2.     $("#cart tbody tr:visible:even").removeClass("odd").addClass("even");   
  3.     $("#cart tbody tr:visible:odd").removeClass("even").addClass("odd");   
  4. }  
 

2.拒絕非數字輸入
通過javascript,可以檢查用戶輸入的內容是否符合我們的要求,以便在將表單發送到服務器之前對用戶給出反饋,這種技術叫做輸入掩碼。
輸入驗證是根據某些有效輸入的標準來檢查用戶輸入的過程。輸入掩碼會在用戶填寫內容的同時應用標準,並簡單地禁止無效的按鍵操作。
比如,在這個購物車表單的例子中,必須在輸入字段中填寫數字。通過使用輸入掩碼驗證,可以在這些字段獲得焦點時,讓非數字按鍵操作不起作用

Js代碼 複製代碼
  1. $(".quantity input").keypress(function(event){   
  2.     if(event.charCode && (event.charCode < 48 || event.charCode > 57)){   
  3.         event.preventDefault();   
  4.     }   
  5. });  

在這裏我們要觀察的是keypress事件,這個事件不提供keyCode屬性,但提供了charCode屬性。

調用preventDefault()方法會阻止瀏覽器響應相應的事件。

 

3.數字計算

表單中有個recalculate按鈕,單擊這個按鈕會把表單提交到服務器,重新計算總金額再把表單展示給用戶。但是這個往返過程是不必要的,所有工作都可以在瀏覽器中通過jquery來完成。

在shipping行中顯示訂購商品的數量。但用戶修改了其中一行的數量時,我們要合計所有輸入值以得到新的數量,然後將總數顯示在相應的單元格中。

Js代碼 複製代碼
  1. $(".quantity input").change(function(){   
  2.     var totalQuantity = 0;   
  3.     $("#cart tbody tr").each(function(){   
  4.         var quantity = parseInt($(".quantity input",this).val());   
  5.         totalQuantity += quantity;   
  6.     });   
  7.     $(".shipping .quantity").text(String(totalQuantity));   
  8. });  

我們只有在change事件發生時執行計算。這樣,只有當用戶離開字段並填寫了同以前不一樣的值時,纔會導致重新計算總數量。

 

a.解析和格式化貨幣值

Js代碼 複製代碼
  1. var price = parseFloat($(".price",this).text().replace(/^[^/d.]*/,""));   
  2. price = isNaN(price) ? 0 : price;   
  3. var cost = quantity * price;   
  4. $(".cost",this).text("$"+cost);  

 用正則表達式去掉價格前的貨幣符號,然後把得到的字符傳遞給parseFloat(),把價格轉成浮點數。

我們必須確保找到了數字值,如果沒有則將其設置爲0。最後,用價格乘以數量,再與$連接放到總費列中

 

b.處理小數位

用toFixed方法返回一個舍入到相應小數位後的浮點數的字符串

 

c.其他計算

1.合計subtotal行最後一列的總費用。

Js代碼 複製代碼
  1. $(".quantity input").change(function(){   
  2.     var totalQuantity = 0;   
  3.     var totalCost = 0;   
  4.     $("#cart tbody tr").each(function(){   
  5.         var price = parseFloat($(".price",this).text().replace(/^[^/d.]*/,""));   
  6.         price = isNaN(price) ? 0 : price;   
  7.         var quantity = parseInt($(".quantity input",this).val());   
  8.         var cost = quantity * price;   
  9.         $(".cost",this).text("$"+cost.toFixed(2));   
  10.         totalQuantity += quantity;   
  11.         totalCost += cost;   
  12.     });   
  13.     $(".shipping .quantity").text(String(totalQuantity));   
  14.     $(".subtotal .cost").text("$" + totalCost.toFixed(2));   
  15. });  
 

2.計算稅金

爲了計算稅金,需要用相應的數字除以100得到稅率,再用合計金額乘以稅率。不過,計算稅金時總要向上舍入的,因此必須保證在顯示和計算時使用正確的值。

在這裏,我們用稅金乘以100會使它變成一個以分而不是元表示的值,通過Math.ceil()舍入這個值是安全的。舍入之後,再除以100就可以將這個值轉換回以元表示的值。

Js代碼 複製代碼
  1. var taxRate = parseFloat($(".tax .price").text())/100;   
  2. var tax = Math.ceil(totalCost * taxRate * 100)/100;   
  3. $(".tax .cost").text("$" + tax.toFixed(2));   
  4. totalCost += tax;  
 

3.計算運費

用商品數量乘以單件商品的運輸費率就可以得到總運費

Js代碼 複製代碼
  1. var shippingRate = parseFloat($(".shipping .price").text().replace(/^[^/d.]*/,""));   
  2. var shipping = totalQuantity * shippingRate;   
  3. $(".shipping .cost").text("$" + shipping.toFixed(2));   
  4. totalCost += shipping;  
 

現在我們已經完全重寫了可能發生的任何服務器計算。因此,可以安全的隱藏recalculate按鈕了

 

4.刪除商品

如果購物者在把商品放到購物車中之後改變了注意,可以將相應商品的quantity字段修改爲0。然而,我們還可以提供一種更可靠的行爲,即爲每件商品都添加一個明確的delete按鈕。雖然單擊這個按鈕的實際效果與修改quantity字段相同,但這種視覺上的反饋可以強化不會購買相應商品的事實。

Js代碼 複製代碼
  1. $("<th>&nbsp;</th>").insertAfter("#cart thead th:nth-child(2)");   
  2. $deleteButton = '<img src="images/delete.gif" width="16" height="16" title="remove from cart" alt="remove from cart" class="clickable" />';   
  3. $("<td></td>").append($deleteButton).insertAfter("#cart tbody td:nth-child(2)");   
  4. $("img.clickable").click(function(){   
  5.     $(this).parents("tr").hide().find(".quantity").children("input").val(0).trigger("change");   
  6. });   
  7. $("<td>&nbsp;</td>").insertAfter("#cart tfoot td:nth-child(2)");  

 

 

table.zip (40.1 KB)

 

 

 

轉自:http://ice-cream.javaeye.com/blog/326425

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章