【问题标题】:Disabling checkbox works, but it's not being processed on onchange禁用复选框有效,但未在 onchange 上处理
【发布时间】:2013-03-23 07:37:36
【问题描述】:

当复选框被javascript函数设置为false时,下一个函数似乎并不知道它已被设置为false,它只是忽略它。

HTML

<input type="checkbox" name="accs" id="50" class="arms"/>Arm 1: $50<br/>
<input type="checkbox" name="accs" id="60" class="arms"/>Arm 2: $60<br/>
<input type="checkbox" name="accs" id="70" class="neck"/>Neck 1: $70<br/>
<input type="checkbox" name="accs" id="80" class="neck"/>Neck 2: $80<br/>
<div id="total">$500</div>

Javascript:该函数根据输入类禁用复选框

$('.arms, .neck').change(function(){
var myClass = $(this).attr('class'); 
$('.'+myClass).not(this).prop('checked', false); 
});

Javascript 下一个函数:如果复选框被启用或禁用,则处理操作的代码块

var input = document.getElementsByTagName("input");
var total = document.getElementById("total");
var prev;

for(i=0;i<input.length;i++){


input[i].onchange = function(){
if (this.type != 'text'){
  if(this.checked){

$("#total").fadeOut(300);
$("#total").fadeIn(300);

prev=parseFloat(total.innerHTML.replace(/[^0-9\,]+/g,"")) + parseFloat(this.id);
         total.innerHTML = "$" + prev.formatMoney(0, ',', '.');
    }else{
$("#total").fadeOut(300);
$("#total").fadeIn(300);

prev=parseFloat(total.innerHTML.replace(/[^0-9\,]+/g,"")) - parseFloat(this.id);
         total.innerHTML = "$" + prev.formatMoney(0, ',', '.');
     }
   }
  }
}

点击所有复选框后,您意识到它不会回到原来的价格 (500) 而是继续加起来。

Fiddle

我没有使用收音机的原因是因为表单必须为所有选项发送相同的“输入名称”

【问题讨论】:

  • 如果你只想选择一个手臂和一个脖子,为什么不使用两个无线电组而不是四个复选框?
  • @j08691 收音机是最好的选择,但我们的项目很难将格式更改为收音机。如果每个收音机在 html 中都有相同的输入属性:name="accesory" 并且也与第一个函数兼容,那么它会起作用
  • 耻辱,您可以通过以下方式减少它(并解决问题):jsfiddle.net/j08691/kU6ac/2。另外,您应该真正在 value 属性中设置值,而不是 ID。
  • id 不能以数字开头(或者只是 html 5 中的数字)stackoverflow.com/questions/70579/…
  • 我提出了一种可能的解决方案 - 与您的完全不同,但如果可以的话,请将其用于想法。

标签: javascript jquery


【解决方案1】:

我在这里设置了一个小提琴:http://jsfiddle.net/MarkSchultheiss/r6MXA/2/ 使用此标记:

<input type="checkbox" name="accs" icost="50" class="arms" />Arm 1: $50
<br/>
<input type="checkbox" name="accs" icost="60" class="arms" />Arm 2: $60
<br/>
<input type="checkbox" name="accs" icost="70" class="neck" />Neck 1: $70
<br/>
<input type="checkbox" name="accs" icost="80" class="neck" />Neck 2: $80
<br/>
<div id="total">$500</div>

还有这段代码:

var items = $('input.arms[type="checkbox"], input.neck[type="checkbox"]');
items.change(function () {
    var myClass = $(this).attr('class');
    $('.' + myClass).not(this).prop('checked', false);
    var total = $('#total');
    var totalcost = 0;
    total.fadeOut(300);
    items.filter(':checked').each(function (i) {
        var cost = $(this).attr('icost');
        totalcost = totalcost + parseFloat(cost);
    });
    total.text("$" + totalcost + ".00"); // fix your format here as needed
    total.fadeIn(300);
});

编辑:根据文本总区域中的当前值管理整个检查/取消检查循环。

var items = $('input.arms[type="checkbox"], input.neck[type="checkbox"]');
// get the initial total and store in a data for use later (resets as needed)
var total = $('#total');
total.data("currentvalue", parseFloat(total.text().replace(/[^0-9\,]+/g, "")));
items.change(function () {
    var currenttotal = total.data("currentvalue");
    var myClass = $(this).attr('class');
    var thisGroup = $('.' + myClass);
    var notme = $('.' + myClass + ':checked').not(this);
    var notmeCost = (notme.length ? notme.attr('icost') : ($(this).is(':checked') ? 0 : $(this).attr('icost')));

    notme.prop('checked', false);
    currenttotal = currenttotal - notmeCost;
    total.fadeOut(300);
    thisGroup.filter(':checked').each(function (i) {
        var cost = $(this).attr('icost');
        currenttotal = currenttotal + parseFloat(cost);
    });
    total.data("currentvalue", currenttotal);
    total.text("$" + currenttotal + ".00"); // fix your format here as needed
    total.fadeIn(300);
});

【讨论】:

  • 谢谢@MarkSchultheiss,这非常有用!唯一的问题是它不采用起始值(500)它只是将配件相加但不包括整个 $500
  • 我想知道这一点并有一个问题 - 复选框激活后其他事件是否可以改变该值?如果是这种情况,您将需要 1. 保存值(您知道如何),减去已检查组中当前检查的值(请参阅第一部分 myClass 的内容),-我可以更新以执行此操作..
  • 完成 @MarkSchultheiss jsfiddle.net/r6MXA/10 我挽救了价值,在第一轮有效,但之后发生了一些奇怪的事情......
  • 我目前正面临着一些我没想到但并不那么艰难的事情。有些项目可以进行多选。例如,如果我想为武器做多项选择怎么办?条件应该在这一行:if(input!=arms){notme.prop('checked', false);}
猜你喜欢
  • 2020-02-05
  • 2017-03-04
  • 2021-04-11
  • 1970-01-01
  • 2021-05-06
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多