【问题标题】:Run function on input change and checkbox change在输入更改和复选框更改时运行功能
【发布时间】:2014-08-29 22:57:18
【问题描述】:

我有一个包含多种表单的 Bootstrap 模式。所有表单都有一个输入字段和复选框。每次发生更改事件时,我都会尝试运行函数update_amounts_modal。这在我更改输入值时起作用,但在我选中/取消选中复选框时不起作用。

更新我已经创建了一个小提琴HERE

功能:

function update_amounts_modal(){
  var sum = 0.0;
  $('form').each(function() {
    var qty = $(this).find('.qty input').val();
    var price = $(this).find('.price input').val();
    qty= parseInt(qty) || 0;
    price= parseFloat(price) || 0;
    var amount = (qty*price)
                 sum+=amount;
  });
    $('.total-modal').text('€'+sum.toFixed(2));
}

变化函数:

  update_amounts_modal();
  $('form .qty').change(function(){
    update_amounts_modal();
    $('.total-modal').change();
  });

HTML:

<form method="post" data-target="#modal" data-async="" action="action_url">
  <div class="qty cell">
    <input type="text" class="qty" value="1" name="quantity">
  </div>
  <div class="price cell">
    <span class="euro">€</span><input type="text" disabled="" class="price" value="0.60">
  </div>
  <div class="checkbox cell">
     <input type="checkbox" checked="" value="12933006" name="product[]" class="idRow">
  </div>
</form>

//And more forms exactly like this but with different input values!

<div class="total-modal">€0.00</div>

实际需要发生的是,通过选中/取消选中需要使用函数重新计算值。因此,如果您将 qty 设置为 10 并且取消选中该复选框,则必须从总数中扣除该金额(10 倍,例如 €0.25)。

我认为这样的事情应该可行,但事实并非如此:

$(".idRow").change(function(){
  if($(this).attr("checked")){
    update_amounts_modal();
  }
  else{
    update_amounts_modal();
  }

我没有收到错误,只是没有发生任何事情。有没有更好的方法来实现这一点?

【问题讨论】:

  • 为什么在这两种情况下都调用同一个函数?..
  • @DavidThomas:查看更新的答案!

标签: javascript jquery


【解决方案1】:

我不确定你的问题是否正确,但我认为你正在寻找这样的东西:

function update_amounts_modal() {
    var sum = 0.0;
    $('form').each(function () {
        var qty = $(this).find('.qty').val();
        var price = $(this).find('.price').val();
        var isChecked = $(this).find('.idRow').prop("checked");
        if (isChecked){
            qty = parseInt(qty, 10) || 0;
            price = parseFloat(price) || 0;
            var amount = (qty * price);
            sum += amount;
        }
    });
    $('.total-modal').text('€' + sum.toFixed(2));
}

$().ready(function () {
    update_amounts_modal();
    $('form .qty, form .idRow').change(function () {
        update_amounts_modal();
    });
});

Check JSFiddle Demo


更新:

如果在某些表单中您没有 CheckBox(换句话说,某些价格不是可选的),那么您必须检查 CheckBox 是否存在以及是否存在,因此请检查是否已选中。
为此,请像这样修改更新函数:

function update_amounts_modal() {
    var sum = 0.0;
    $('form').each(function () {
        var qty = $(this).find('.qty').val();
        var price = $(this).find('.price').val();
        var checkbox = $(this).find('.idRow');
        if (checkbox.prop("checked") || checkbox.length == 0){
            qty = parseInt(qty, 10) || 0;
            price = parseFloat(price) || 0;
            var amount = (qty * price);
            sum += amount;
        }
    });
    $('.total-modal').text('€' + sum.toFixed(2));
}

在这一行中:if (checkbox.prop("checked") || checkbox.length == 0){ 我们说如果复选框被选中 (checkbox.prop("checked")) 或没有复选框 (checkbox.length == 0) 则对值求和。

Check JSFiddle Demo

【讨论】:

  • Moshtaf :您创建了一个非常好的小提琴来解释。那里有很大的帮助..
  • @Moshtaf:相信我,我试过了,但没有成功。现在我在小提琴中看到它确实有效但不在我的模式中。这有关系吗?不,我认为。我会接受答案,因为您指出了正确的方向。
  • 我认为您的问题不是问题中提到的,您没有读取计算功能中复选框的状态,无论复选框是否更改,您在我的答案中看到这一行吗? if (isChecked){ 我添加了这个并且还在.change 函数中添加了form .idRow。如果未选中复选框,我认为您忘记从 sum 中删除值。
  • @Moshtaf:最后一个问题.. 如果isChecked 返回未定义怎么办?如何绕过它以便update_amounts_modal 仍然计算总数?
【解决方案2】:

试试这个:而不是 attr 使用 prop

$(".idRow").change(function(){
   if($(this).prop("checked")){
    update_amounts_modal();
   }
   else{
       update_amounts_modal();
    }
});

【讨论】:

  • 以前试过这个,但仍然没有更新总量。还有其他建议吗?
  • 您说“当我选中/取消选中复选框时不起作用”.. 上面的答案解决了与选中/取消选中复选框时调用的函数相关的问题。它不能解决你必须做的函数内部的问题..
【解决方案3】:

你可以的

<div class="checkbox cell">
    <input type="checkbox"/>
</div>

jQuery("div.checkbox > input:checkbox").on('click',function(){
    alert('asdasd');
});

http://jsfiddle.net/1r7rk21w/

【讨论】:

  • 之前尝试过,但仍然没有更新总量。还有其他建议吗?
  • 我创建了一个小提琴。你可以明白我的意思
【解决方案4】:

如果您希望根据选中的属性更新值,那么您的 sum 函数需要实际使用该复选框,对吗?

JS:

$('form').each(function () {
    if ($(this).find(".idRow").prop("checked") === true){
        //
        // The normal computations you had before...
        //
    } 
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多