5

ボタンをクリックしてフィールドを追加できるこの分割機能があります。私の問題は、フィールドを追加すると正確な金額を取得できず、フィールドを削除すると金額が元に戻らないことです。

サンプル シナリオ:

ここに画像の説明を入力

上の画像は初期金額-1,000.50を示しています。今、これらは私の問題です。

ここに画像の説明を入力

  1. 50結果の最初のフィールドのPayee: 1 [-950.50]金額に、受取人の残額として入力します。別のフィールドを追加すると、金額が自動入力されます-950.50。それが残りの金額であるため、期待しています。しかし、私が得るのは-1,000.50、2 番目のフィールドの初期量です。更新された残りの金額を取得するにはどうすればよいですか?

  2. 追加したフィールドを削除すると、金額を元に戻したいです。たとえば。フィールドに が50あり、残量が の場合-950.50。金額を含むフィールドを削除する 50と、残りの金額に戻す必要があり、それは になります-1,000.50金額を戻す方法は?

これが私が試したことです:

split.html

<table id="dataTable" class="calendar fluid" data-calendar-options='{"maxHeight":70}'"
    <caption> Payee: 1 
        [<span id="remaining">-1,000.50</span>]
    </caption>

    <tbody>
        <tr>
            <td class="week-end" id="p_scents"><br/>
                *Note: Amount totals must equal transaction total and envelopes must be specified to 
                       enable the split button.<br/><br/>

                <p class="button-height">
                    <span class="input">
                        <label class="button orange-gradient">Envelope #1</label>

                        <select name="env[]" class="envelope select compact">
                            <option value="none">(Select)</option>

                            <optgroup label="Category">
                                <option value="1">Internet</option>
                                <option value="2">Savings</option>
                            </optgroup>
                        </select>

                        <input type="text" name="amt[]" placeholder="0.00" size="10" 
                            id="validation-required" class="input-unstyled input-sep validate[required]"
                            onkeyup="calculate(0)">

                        <input type="text" name="note[]" placeholder="note" class="input-unstyled" id="note">
                    </span>

                    <span class="with-tooltip">
                        <img src="{{STATIC_URL}}img/icons/tick.png" title="Default">
                    </span>
                </p><br/>
            </td>
        </tr>
    </tbody>

    <tfoot>
        <tr>
            <td>
                <a href="javascript:{}" id="addScnt" class="button orange-gradient icon-plus-round">
                    Another Envelope
                </a>
            </td>
        </tr>
    </tfoot>
</table>


<script>
    function calculate(difference) {
        var sum = 0;
        $(":text").each(function() {
            amt = replaceCommaDollar(this.value);
            if(!isNaN(amt) && amt.length!=0) {
                sum += parseFloat(amt);
                total = sum;
                difference = -1,000.50 + total                                  
            }
        });

        $("#remaining").html(numberWithCommas(difference.toFixed(2)));

        if(difference == 0){
            $("#split").html("<button type='submit' class='button orange-gradient'>Split Amount</button>");
        }else{
            $("#split").html("<button type='submit' class='button orange-gradient' disabled='disabled'>Split Amount</button>");
        }
    }

    $(function() {
        var scntDiv = $('#p_scents');
        var i = $('#p_scents p').size() + 1;
        var remain_amount = Math.abs(replaceCommaDollar($("#remaining").text())).toFixed(2);

        $('#addScnt').live('click', function() {  
            $('<p class="button-height">'+
              ' <span class="input">'+
              '     <label class="button orange-gradient">' + 'Envelope #' + i + '</label>' +
              '     <select name="env[]" class="envelope select compact">'+
              '         <option value="none" selected="selected">(Select)</option>' +
              '         <optgroup label="Category">' +
              '             <option value="1">Internet</option>' +
              '             <option value="2">Savings</option>' +
              '         </optgroup>' +
              '     </select>' +
              '    <input type="text" name="amt[]" id="split-amount' + i + '" placeholder="0.00" size="10" class="input-unstyled input-sep" onkeyup="calculate(0)" value="'+ remain_amount +'">'+
              '    <input type="text" name="note[]" placeholder="note" class="input-unstyled">'+
              ' </span>'+
              ' <a href="javascript:{}" id="remScnt" class="with-tooltip">Remove</a></p><br/\>'
              ).appendTo(scntDiv);

             $("#remaining").html('0.00');
             $("#split").html("<button type='submit' class='button orange-gradient'>Split Amount</button>");

             i++;
             return false;
        });

        $('#remScnt').live('click', function() {
            if( i > 2 ) {
                test = $('#split-amount'+i).val();
                alert(test);

                $(this).parents('p').remove();

                i--;
            }

            return false;
        });
    });
</script>
4

1 に答える 1

1
  1. 更新された残りの金額を取得するにはどうすればよいですか? remain_amount追加ボタンをクリックしたときではなく、ドキュメントの準備ができたときに計算しています。のクリック ハンドラ内でその計算を移動する必要があります#addScnt。その関数の最初の行にするだけで、それに応じて再計算する必要があります。

  2. 金額を戻す方法は?これを行うには、削除する入力フィールドから値を読み取ります。デモ用に変更された削除クリック ハンドラを次に示します。

    $('#remScnt').live('click', function() {
        // Might not need the if statement
        if (i > 2) {
            //test = $('#split-amount' + i).val();
            //alert(test);
    
            var $p = $(this).parents('p');
    
            // Consider this approach to getting the removed value
            var textValue = $p.find('input[name="amt[]"]').val();
            var numValue = replaceCommaDollar(textValue);
    
            var $remaining = $("#remaining");
            var remainingValue = replaceCommaDollar($remaining.text());
            var difference = remainingValue - numValue;
    
            var newRemainingValue = numberWithCommas(difference.toFixed(2)))
            $("#remaining").text(newRemainingValue);
    
            $p.remove();
    
            // This might not be needed anymore
            i--;
        }
    
        return false;
    });
    

削除された値を取得するための私のアプローチを考えると、他に行う作業がない限り、関連するロジックを取り除くことができる可能性があることに注意しiてください。削除する要素に基づいて DOM を検索することを検討してください。これおそらく実行が遅くなりますが、不合理ではありません。ただし、それはあなたの選択であり、どちらの方法でもあまり重要ではありません. 私の提案は維持しやすいと思います。最適化するとしたら、このページにはもっと注目に値する他の側面があります。

また、将来的に機能する jsFiddle を作成することをお勧めします。機能する例を使用すると、問題をテストして解決するのがはるかに簡単になります。作成してみましたが、提供されたソースに JavaScript 関数が欠落しているため、HTML と JavaScript を大幅に変更する必要がありました。

それが役立つことを願っています!私の回答に関してご質問はお気軽にどうぞ。ただし、元の問題の範囲を広げないでください。

于 2013-04-15T17:31:57.127 に答える