使用bind

时间:2016-04-26 15:28:50

标签: javascript jquery

我有一个HTML表单,它有多个在不同文本框中进行基本SUM计算的实例。我无法控制更新或重写HTML。我需要一种方法来编写一个通用的和函数,它将" listen"对于任何文本框的更改,执行总和,并在结果文本框中输出结果。

例如:

<input id="txtBox1"/>
<input id="txtBox2"/>
<input id="txtSumOfBox1AndBox2"/>

<input id="txtBox3"/>
<input id="txtBox4"/>
<input id="txtSumOfBox3AndBox4"/>

我想做的是&#34; bind&#34;或&#34;听&#34; (我不知道该使用哪种方式)将会#34;听&#34;改变&#34; txtBox1&#34;或&#34; txtBox2&#34;,进行数学计算,然后将总和输出到结果框中,&#34; txtSumOfBox1AndBox2&#34;。对于方框3和方框4也是如此。

我可以有1到多个这些,他们都需要使用相同的总和计算并输出到各自的结果字段。

我可以有一个实例,我也有以下内容:

<input id="txtBox5"/>
<input id="txtBox6"/>
<input id="txtBox7"/>
<input id="txtBox8"/>
<input id="txtBox9"/>
<input id="txtSumOfBox5Through9"/>

...这是我的javascript:

$('#txtProductAUsed,#txtProductBUsed').on('keypress change', {
  inputs: "txtProductAUsed:txtProductBUsed",
  output: "txtTotalUsed"
}, calc_sum);

$('#txtMixedInValue,#txtAmtNeeded,#txtLeftover').on('change', {
  inputs: "txtMixedInValue:txtAmtNeeded:txtLeftover",
  output: "txtTotalProduct"
}, calc_sum);

function calc_sum(event) {
  var sum = 0;
  var inputFields = event.data.inputs;
  var totalField = event.data.output;

  $.each(inputFields.split(':'), function() {
    sum += Number($('#' + this).val());
  });

  $('#' + totalField).val(sum);
}

我已经阅读了关于jQuery bind的文档,但是对于我如何获取我需要的参数没有任何意义。我得到了寻找“改变”的概念。事件,但没有编码,使其足够通用,可以接受任何输入。

修改 我玩了#34; on&#34;方法并想出了这个。

这是我的解决方案的JSFiddle: https://jsfiddle.net/mrhankuk/4ox7y1v1/1/

1 个答案:

答案 0 :(得分:1)

EDITED(用于在再次更改相同输入时更新值):

所以,我改变了你通过选择器监听你的总和的方式,所以你可以在数组上设置你想要的任何选择器:

$.fn.sumListener = function() {
  var args = arguments;
  var $sumInput = $(this);
  $sumInput.prop("disabled", "disabled");
  for(i in args) {
    $(arguments[i]).on("change", function() {
        $sumInput.val(0);
        $(Array.from(args).join(",")).each(function() {
          $sumInput.val(+$sumInput.val() + +$(this).val());
        });
    });         
  }
};
$("#txtTotalUsed").sumListener("#txtProductAUsed", "#txtProductBUsed");
$("#txtTotalProduct").sumListener("#txtMixedInValue", "#txtAmtNeeded", "#txtLeftover", ".any");

小提琴:https://jsfiddle.net/diegopolido/sexd7b28/2/

我希望它有所帮助