iT邦幫忙

0

如何每種商品總價都隨商品數量變化而變化

  • 分享至 

  • xImage

https://ithelp.ithome.com.tw/upload/images/20201210/20133413Ypnk4YJrCb.jpg

看更多先前的討論...收起先前的討論...
player iT邦大師 1 級 ‧ 2020-12-10 23:16:59 檢舉
除非你只是要做展示頁
不然與金額相關的計算
最好還是從Server端去計算
以免有歹徒幫你洗0元商品大放送

如果真的是展示用的頁面
你會用jQuery抓值,再把字串轉數值後去計算,再把算好的數值轉回字串,再填進你要顯示的地方嗎?
我數量下面的欄位都設同一個class
要怎麼
改鞋子數量的值就只改鞋子總價的值
改衣服數量的值就只改衣服總價的值
archer9080 iT邦研究生 4 級 ‧ 2020-12-11 08:29:21 檢舉
>數量下面的欄位都設同一個id
光這句話就有問題了
常用的class、name、id中,唯一只有id不能相同
好比每個人身分證字號都不同,但名字、血型能相同
id是用來識別每一個東西的
那我數量下面的欄位都設同一個class
要怎麼
改鞋子數量的值就只改鞋子總價的值
改衣服數量的值就只改衣服總價的值
archer9080 iT邦研究生 4 級 ‧ 2020-12-11 09:00:16 檢舉
沒class一樣能做
以鞋子舉例
首先你要先定義
當數量欄位變動時 (keyup)
去取得鞋子的單價
再去改鞋子的總價

ex:
假設鞋子
數量id --> shoes_num
單價id --> shoes_price
總價id --> shoes_price_total

html:

<input type="text" id = "shoes_num"> -->鞋子數量欄位

<span id="shoes_price">1000$</span> --> 單價

<span id="shoes_price_total">總共1000$</span> --> 總價

jquery:

$("#shoes_num").keyup(function(){

let this_val = $(this).val(); // let this_val = $("#shoes_num").val(); 從text 中取值

let shoes_price_str = $("#shoes_price").text(); //span 取文字

let shoes_price = shoes_price_str.substr(0, shoes_price_str.length - 1);//去除最後的$符號

let shoes_price_total = parseFloat(this_val * shoes_price).toFixed(0); //計算

$("#shoes_price_total").empty(); //先清空原本的文字

$("#shoes_price_total").text("總共"+shoes_price_total+"$"); //附值

});

大概是這樣,我也沒詳細去測試
當然還有些細節須處理及注意,這就留給您去發掘囉
用關注點分離的方法
讓資料去驅動畫面
https://codepen.io/gitoxxvn/pen/oNLVYvN
感謝範例
可是多一列商品
多的id要重設一個吧 函式要在多寫一個
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
Pin
iT邦新手 4 級 ‧ 2020-12-11 09:24:22

自行處理異動事件,有蠻多細節要注意,例如使用鍵盤輸入,或者是滑鼠右鍵貼上…等。
可以試看看knockoutjs,如下官網的範例,應該就是你想要的效果:
(不過我看這個範例也沒有處理滑鼠貼上,這個要再研究看看)
https://knockoutjs.com/examples/cartEditor.html

https://ithelp.ithome.com.tw/upload/images/20201211/20042653EGOvSRiALu.png

0

因為不確定你是用何js框架(或沒用框架)
所以只能告訴你理論。沒辦法損給你程式碼。除非你有提供。

基本上來說,可以採用元件連動的處理方式。
處理的原則可以用旁系節點的用。

依table來說的話。你操作的數量是在其tr內的第2個td。
這時你可以依目前操作的input,對應其td後,
在用next(下一個元素),取得其對應單價。
然後再用next(下一個元素),將原本取得的數量跟取得的單價相乘並做顯示。

第二種方式
基本上除了使用next的方式外。其實也可以用eq指定元素級的方式來處理。
當操作數量更新時,先直接往上取得tr內的所有td列表。
再依元素的index值。取得並顯示對應的位置。

以上只是單純列修正的方式解說。並不一定需要用id或是class來處理應用。

2
japhenchen
iT邦超人 1 級 ‧ 2020-12-11 09:44:22

我是這把 { "編號":"0001", "品名":"AAAA" ,"數量":1,"單價":100} 用 jquery的$.data存在每列(table tr或div row)上(用肉眼在原始碼上看不見)

dataArray.forEach(function(rowdata){
    //rowdata是這種型式的object { "編號":"0001", "品名":"AAAA" ,"數量":1,"單價":100}
    let thisrow = $("<tr></tr>");
    thisrow.data("thisdata",rowdata);
    thisrow.append(`<td>${rowdata.編號}</td>`);
    //.................自己練
    $("table #mytable").append(thisrow);
});

在$(document).ready上加入input的on change事件處理

$(function(){
    $(document).on("change", "input .quantity", function () {
            let thisrow = ($(this).parent()).parent();
            // 第一個parent常指的是input上一層的td
            // 第二個parent指的就是td的上層tr了
            let rowdata = thisrow.data("thisdata");
            //假設你的總價放在 <td class="summay"></td> 裡...
            thisrow.find("td .summary").text(rowdata.單價*this.val());
            //this.val()就是那個輸入數量的input的value
    });
});

打完收工

sorry我以jquery做範例,pure javascript很繞口

我要發表回答

立即登入回答