Javascript -在对不同的输入求和后选中/取消选中复选框

Javascript - check/uncheck checkbox after summing different inputs

本文关键字:复选框 取消 求和 输入 Javascript      更新时间:2023-09-26

我有一个'父' <div>和'子'div,单击父<div>后显示。各div均有<checkboxes><input>放量

<checkbox>检查,至少检查一个子<checkbox>

当子<checkbox>被选中/未选中时,<input>中的数量自动变为' 1 '或' '。

父数量<input>被禁用,它应该显示所有子数量的总和。

我有两个问题

首先,当您自己输入数量时,求和脚本工作得很好,但是当数量本身出现/消失时(在检查/取消检查子<checkbox>之后),求和脚本不会对此类更改做出反应。

其次,当所有子复选框都未选中时,我无法取消父<checkbox>的选中。然而,我假设如果求和脚本将开始正常工作,我将能够将父<checkbox>与sum (if (sum> 0){ $('#checkbox0').prop('checked', true);}else{$('#checkbox0').prop('checked', false);}绑定在一起

Html:

    <div class="divCell" id="click1">
    <div class="checkbox_div" style='pointer-events:none;'>
      <input type="checkbox" id="checkbox0">
    </div>   
    <div class="div_name_divcell">Parent - click to open</div>
    <div class="div_quantity_divcell">
    <input type="text" name="parent_1" class="quantity_class_parent_1" id="quantity_parent_1" size="1" maxlength="3" onkeypress="return numbersonly(this, event)" disabled="disabled">
   </div>
</div>
<div id="hidden1" style="display: none;">
 <div class="divCell" id="child_click1">
    <div class="checkbox_div">
      <input type="checkbox" id="checkbox1">
    </div>   
    <div class="div_name_divcell">Child1</div>
    <div class="div_quantity_divcell">
      <input type="text" name="child_1" class="quantity_class_child" id="quantity_child_1" size="1" maxlength="3" onkeypress="return numbersonly(this, event)">
   </div>
 </div>
  <div class="divCell" id="child_click2">
    <div class="checkbox_div">
      <input type="checkbox" id="checkbox2">
    </div>   
    <div class="div_name_divcell">Child2</div>
    <div class="div_quantity_divcell">
      <input type="text" name="child_1" class="quantity_class_child" id="quantity_child_2" size="1" maxlength="3" onkeypress="return numbersonly(this, event)">
   </div>
 </div>
</div>
Css:

.divCell {width: 500px;height: 35px;margin: 2px 0;display: inline-block;background-color: #D4F78F;}
.div_quantity_divcell{float:right; padding:9px 1px 0 0}
.checkbox_div {width: 25px;position: relative;margin: 5px;float: left;}
.div_name_divcell {line-height: 35px;width: auto;float: left;}
JavaScript:

    $(document).ready( function() {
        event.preventDefault();
        $('#checkbox1').click(function() {
        if(this.checked){     
            $('#checkbox0').prop('checked', this.checked); 
            $('#quantity_child_1').val('1')     
        }else{ 
            $('#quantity_child_1').val('')
        //$('#checkbox0').prop('checked', false);
        }});
        $('#quantity_child_1').keyup(function(){
            $('#checkbox1').prop('checked', this.value > 0);
        $('#checkbox0').prop('checked', true);
        })
      //second child
        $('#checkbox2').click(function() {
        if(this.checked){     
            $('#checkbox0').prop('checked', this.checked); 
            $('#quantity_child_2').val('1')     
        }else{ 
            $('#quantity_child_2').val('') 
        //$('#checkbox0').prop('checked', false);
        }});
        $('#quantity_child_2').keyup(function(){
            $('#checkbox2').prop('checked', this.value > 0);
        $('#checkbox0').prop('checked', true);
        })
    });
    // suming script
    $(document).on('change', '.quantity_class_child', function(){
        var sum = 0;
        $('.quantity_class_child').each(function(){
        sum += +$(this).val();
        });
        $('#quantity_parent_1').val(sum);
    });
//opening script
$(document).ready(function() {
  $('#click1').click(function() {
        if ($('#hidden1').is(':hidden')) {
       $('#hidden1').show(500);
    } else {
       $('#hidden1').hide(500);
    }
  });
});

JSFiddle: https://jsfiddle.net/mamzj4tw/6/

这是您的版本的更新版本

https://jsfiddle.net/mamzj4tw/13/

它使用each()来更好地(和清洁)添加动作到输入。

你可以在你想要的时候创建你的自定义事件,比如do-sum和fire。在这个例子中,我定义了求和在什么时候执行$(document).trigger('do-sum');
触发执行和事件。

,我已经设置了一个监听器来执行你的例程:

$(document).on('do-sum', function(){ var sum = 0; $('.quantity_class_child.active').each(function(){ sum += +$(this).val(); }); $('#quantity_parent_1').val(sum); var parentChecked = false; $('#hidden1 input[type="checkbox"]').each(function(i, e){ if($(e).is(':checked')) { parentChecked = true; } }); $('#checkbox0').prop('checked', parentChecked); });

我还使用active类设置有效的输入(并快速求和)。

PS你不需要event.preventDefault();后文档准备事件

好的,这些是你可以做到的,

首先,当您自己输入数量时,求和脚本工作正常,但是当数量本身出现/消失时(在检查/取消检查子元素之后),求和脚本不会对此类更改做出反应。

事情是改变事件将不会被触发,如果你正在设置/改变从javascript的值。为此,您可以手动调用更改事件来触发该效果。或者,为求和计算创建一个单独的函数,并在复选框的uncheck事件时调用它。

$('#checkbox1').click(function() {
    if (this.checked) {
      $('#checkbox0').prop('checked', this.checked);
      $('#quantity_child_1').val('1')
    } else {
      $('#quantity_child_1').val('')
      $(".quantity_class_child").trigger("change");
        //$('#checkbox0').prop('checked', false);
    }
  });

$('#checkbox1').click(function() {
    if (this.checked) {
      $('#checkbox0').prop('checked', this.checked);
      $('#quantity_child_1').val('1')
    } else {
      $('#quantity_child_1').val('');
        summation();
    }
  });
function summation(){
  var sum = 0;
  $('.quantity_class_child').each(function() {
    sum += +$(this).val();
  });
  $('#quantity_parent_1').val(sum);
 }

第二部分,

其次,当所有子复选框都未选中时,我无法取消父复选框。

在求和过程中,勾选输入框的长度,如果长度为零,取消勾选。

你的代码有点复杂,所以我重写了你试图存档的内容(没有css部分)。小提琴在

三个HTML小div

<div class="parent" id="parent">
 <span class="input">
  <input type="checkbox" name="parent" value="">
  <label for parent>parent - click to open</label>
  <input type="text" name="sum">
 </span> 
</div>
<div class="child" id="child1">
 <span class="input">
  <input type="checkbox" class="inputCheckbox" name="child1" value="child1">
  <input type="text" class="inputSum" name="sum1">
 </span> 
</div>
<div class="child" id="child2">
 <span class="input">
  <input type="checkbox" class="inputCheckbox" name="child2" value="child2">
  <input type="text" class="inputSum" name="sum2">
 </span> 
</div>

和一点jquery

$('.child').hide(); 
// check if parent checkbox is checked
$('input[name="parent"]').click ( function () { 
  if ( $(this).is(':checked') ) $('.child').show(); else $('.child').hide();
})
// check if childcheckbox is checked , if true trigger keyup and sum
$('.inputCheckbox').on ( 'change', function () {  
 if ( $(this).is(':checked') )  $(this).next().val('1').keyup();
// if not , trigger parent
 if ( ! $('.inputCheckbox').is(':checked')  ) $('input[name="parent"]').click ();  
})
// check if value is entered and sum it on keyup
$('.inputSum').on('keyup', function () {  
 var sum = 0;
 $('.inputSum').each ( function () { sum +=  ( $(this).val() - 0)   })
 $('input[name="sum"]').val(sum)
})

HTH

可以添加新元素https://jsfiddle.net/mamzj4tw/34/

$(document).ready( function() {
    $('.drop-down #checkbox').on('change',function(){
        $(this).closest('.divCell').find('#quantity_child')
        .val(this.checked ? 1:'').trigger('keyup');
    });
    $(document).on('keyup click', '.quantity_class_child', function(){
        $(this).closest('.divCell').find('#checkbox').prop("checked",+$(this).val());
        var sum = 0;
        $('.quantity_class_child').each(function(){sum += +$(this).val()});
        $('#quantity_parent_1').val(sum ||'');
        $('#checkbox0').prop("checked", sum);
    });
    $('#click1').click(function() { $('#hidden1').toggle(500); });
});