2016-03-04 12 views
5

を使用してクラスを持つすべての要素のドルの合計を取得します。私は次のHTMLを持ってjQueryの

<div class="balance"> 
    <div class="heading"> 
     <p class="total"><span>00</span></p> 
    </div> 
    <div class="instance withdrawal"> 
     <h3>Random</h3> 
     <p>desc</p> 
     <p class="amount">$350.<span>00</span></p> 
    </div> 
    <div class="instance deposit"> 
     <h3>Added in</h3> 
     <p>desc</p> 
     <p class="amount">$1,250.<span>00</span></p> 
    </div> 
    <div class="instance withdrawal"> 
     <h3>Bill</h3> 
     <p>desc</p> 
     <p class="amount">$50.<span>00</span></p> 
    </div> 
</div> 
<!--end wallet-container left--> 

は、どのように私は、総預金を取る追加引き出しを引くとp.totalにそれを追加するjQueryのを使用することができますか?

+0

あなたは、これはあなたのマークアップが見えるように何が起こっているかであることを確信していますか?もしそうなら、ちょっと怪しいですが、達成するのはあまり難しくありません。 –

+0

うん。マークアップはなぜ怪しいのですか?スパンの要素を使ってセントの金額を書式設定する – JordanBarber

+0

本来の金額からセントを分けたり、スタイルを変えたりすることは考えられませんでしたが、有効でなければなりません –

答えて

1

.deposit.withdrawal要素の子孫として小数を含む第二の兄弟span要素を含む整数を含む第一span要素の前$文字を配置することによって、わずかにhtmlを調整してみてください。 withdrawal,deposit,totalプロパティを含む参照オブジェクトにdata-*属性を利用する。 Array.prototype.reduce();​​; String.prototype.replace()(コンマ用),文字。 .each()

var res = { 
 
    deposit: 0, 
 
    withdrawal: 0, 
 
    total: 0 
 
}; 
 

 
function calculate(el) { 
 
    return el.get().reduce(function(a, b) { 
 
    return Number(a.textContent.replace(/,/g, "")) + Number(b.textContent) 
 
    }) 
 
} 
 

 
$(".deposit, .withdrawal").each(function(i, el) { 
 
    res[$(el).data().type] += calculate($("span", el)) 
 
}) 
 

 
res.total = res.deposit - res.withdrawal; 
 

 
$(".total span").html(res.total);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> 
 
</script> 
 
<div class="balance"> 
 
    <div class="heading"> 
 
    <p class="total" data-type="total"><span>00</span> 
 
    </p> 
 
    </div> 
 
    <div class="instance withdrawal" data-type="withdrawal"> 
 
    <h3>Random</h3> 
 
    <p>desc</p> 
 
    <p class="amount">$<span>350</span><span>.00</span> 
 
    </p> 
 
    </div> 
 
    <div class="instance deposit" data-type="deposit"> 
 
    <h3>Added in</h3> 
 
    <p>desc</p> 
 
    <p class="amount">$<span>1,250</span><span>.00</span> 
 
    </p> 
 
    </div> 
 
    <div class="instance withdrawal" data-type="withdrawal"> 
 
    <h3>Bill</h3> 
 
    <p>desc</p> 
 
    <p class="amount">$<span>50</span><span>.00</span> 
 
    </p> 
 
    </div> 
 
</div> 
 
<!--end wallet-container left-->

3

お試しくださいfiddle

浮動小数点を考慮して編集しました。

JS

$(function() { 
    var total = 0; 

    // Check each instance 
    $('.instance').each(function() { 
    var 
     $this = $(this), 
     clone = $this.find('.amount').clone(), 
     amount = 0, 
     floating = 0; 

    // Get floating point 
    floating = parseFloat('0.' + clone.find('span').text()); 
    clone.find('span').remove(); 

    // Get integer amount 
    amount = parseInt(clone.text().replace(/\D+/gim, ''), 10); 

    if (!isNaN(amount) && amount > 0) { 
     if ($this.is('.deposit')) total += (amount + floating); // Deposit 
     else if ($this.is('.withdrawal')) total -= (amount + floating); // Withdrawal 
    } 
    }); 

    // Format total with commas 
    var formatted = ('' + parseInt(total, 10)).split('').reverse().join(''); 
    formatted = formatted.replace(/(\d{3})/gim, '$1,'); 
    formatted = formatted.split('').reverse(); 
    if (formatted[0] == ',') formatted.shift(); 
    formatted = formatted.join(''); 

    $('.total').text('$' + parseInt(formatted, 10) + '.'); 

    var decimal = (total - parseInt(total, 10)) * 100; 
    $('.total').append('<span>' + decimal + '</span>') 
}); 
+0

これは著者の例では機能しますが、入出金時に小数点以下桁区切りの場合はparseFloatを使用する必要がありますので、「役に立たない」「」は削除しないでください。さらに、第2引数なしで 'parseInt'を使わないようにしてください。誤解を招きます。 – Suicideboy

+0

@Tomisolそれを指摘してくれてありがとう、私はコードを編集しました。私はparseInt()の2番目のパラメータを認識していませんでした。 – KiiroSora09

関連する問題