如何在前端输入字段的每次更改时自动触发特定按钮单击事件

How to trigger a particular button click event automatically on each change in front end input field

我有一个订单页面,我需要在其中获取所有产品价格并应用一些计算来找出最终价格。 我已经完成了所有这些计算,并通过 jQuery.

使用按钮单击事件显示了结果。

但是每当我更新输入字段时,我都需要单击按钮来更新之前计算的结果并显示新结果。

如何在不点击按钮的情况下完成此操作?如果整个内容发生任何变化,我需要自动触发按钮点击。

如果可以通过 Ajax 完成,你能帮帮我吗?

请在下面找到我当前的 jQuery 代码。

//Update data corresponding to change in value of days field
$(document).on('change', '#order-edit-extracost', function(e) {
    var days = $('#order-edit-extracost').val();
    var cost = (parseFloat(days) * 0.5).toFixed(2);
    $('#order-edit-extracost-sum').val(cost);
})

// Order page Price calculations
$(document).on('click', '#calculate-cost', function(e) {
    var prev_cost = $('.total-prev').html();
    var prev_cost_float = parseFloat(prev_cost.match(/-?(?:\d+(?:\.\d*)?|\.\d+)/)[0]);
    var wastetype_sum = 0;
    //find sum of all wastetype rows
    $( '.order-wastetypeRow' ).each(function( index ) {
      var wastetype_price = $(this).find('#order-edit-wasteprice').val();
      prev_cost_float = parseFloat(prev_cost_float) + parseFloat(wastetype_price);      
    });
    //calculate VAT and add it to the sum
    var extra_cost = $('#order-edit-extracost-sum').val();
    var final_cost = (parseFloat(prev_cost_float) + parseFloat(extra_cost)).toFixed(2);
    $('.est-cost').html("CHF "+final_cost);
    var vat_in_float = parseFloat(final_cost);
    var vat_amount = (vat_in_float * 0.077).toFixed(2);
    $('.final-vat').html("CHF "+vat_amount);
    var total = (parseFloat(final_cost) + parseFloat(vat_amount)).toFixed(2);
    //show calculated costs
    $('.final-amount').html("CHF "+total);
    $('#finalcost-layout').show();
    $('.submit-cost').show();
});

您可以在 on change 事件方法中添加以下触发函数。

$( "#calculate-cost" ).trigger( "click" );

喜欢下面

$(document).on('change', '#order-edit-extracost', function(e) {
var days = $('#order-edit-extracost').val();
var cost = (parseFloat(days) * 0.5).toFixed(2);
$('#order-edit-extracost-sum').val(cost);
$( "#calculate-cost" ).trigger( "click" );
});

好的,首先我只想指出,有一种更方便的方法可以将事件侦听器附加到 jQuery 中的元素。像这样:

$("#order-edit-extracost").change(function(){
});

$("#calculate-cost").click(function(){
});

现在回答你的问题,正如@freedomn-m 所说,Ajax 通常用于调用 server/service。没有它也可以实现你想要的。所以首先,你应该创建一个函数来进行计算,如下所示:

function calculateTotal() {
    var prev_cost = $('.total-prev').val();
    var prev_cost_float = parseFloat(prev_cost.match(/-?(?:\d+(?:\.\d*)?|\.\d+)/)[0]);
    var wastetype_sum = 0;

    //find sum of all wastetype rows
    $( '.order-wastetypeRow' ).each(function( index ) {
      var wastetype_price = $(this).find('#order-edit-wasteprice').val();
      prev_cost_float += parseFloat(wastetype_price);      
    });

    //calculate VAT and add it to the sum
    var extra_cost = $('#order-edit-extracost-sum').val();
    var final_cost = (parseFloat(prev_cost_float) + parseFloat(extra_cost)).toFixed(2);
    $('.est-cost').html("CHF "+final_cost);
    var vat_in_float = parseFloat(final_cost);
    var vat_amount = (vat_in_float * 0.077).toFixed(2);
    $('.final-vat').html("CHF "+vat_amount);
    var total = (parseFloat(final_cost) + parseFloat(vat_amount)).toFixed(2);

    //show calculated costs
    $('.final-amount').html("CHF "+total);
    $('#finalcost-layout').show();
    $('.submit-cost').show();
};

接下来,为了将输入字段附加到函数,您可以将 oninput 属性添加到 HTML 语法,如下所示:

<input class="total-prev" type="text" oninput="calculateTotal()"/>

或者,您可以使用元素通用的选择器,例如 class,并通过遍历它们来附加 input 事件侦听器。像这样:

$('.input').map(function() {
    $(this).on('input', calculateTotal);
});

input 事件将在每次向字段输入内容时触发。