-1

我需要获取选中复选框的值(一次只允许选中一个),并且我有这个详细的代码来执行此操作:

if (!checkboxSelected) {
    return;
}

if($("#ckbx_produceusage").is(':checked')) {
    rptval = $('#ckbx_produceusage').val();
}
else if($("#ckbx_deliveryperformance").is(':checked')) {
    rptval = $('#ckbx_deliveryperformance').val();
}
else if($("#ckbx_fillrate").is(':checked')) {
    rptval = $('#ckbx_fillrate').val();
}
else if($("#ckbx_pricecompliance").is(':checked')) {
    rptval = $('#ckbx_pricecompliance').val();
}
setEmailAndGenerateValsForUnitReportPair(unitval, rptval);

有没有一种方法可以让这段代码不那么冗长而又不至于让人难以理解?我想动态地将一个类添加到选中的复选框中,然后从之前添加过该类的任何内容中删除它,然后根据当前使用该类装饰的那个来获取 rptval。不过,这似乎有点臭或 Rubegoldbergesque,所以我正在寻找更好的解决方案。

更新

对于 TJ Crowder,这里是 HTML(Razor/ASP.NET MVC 样式):

@foreach (var rpt in reports)
{
    @* convert id to lowercase and no spaces *@
    var morphedRptName = @rpt.report.Replace(" ", string.Empty).ToLower();
    <input class="ckbx leftmargin8" id="ckbx_@(morphedRptName)" type="checkbox" value="@rpt.report" />@rpt.report
}
4

5 回答 5

1

JQuery 集合是可过滤的,所以我建议使用以下内容:

// get value of first checked checkbox
var rptval = $(
   "#ckbx_produceusage,"+
   "#ckbx_deliveryperformance,"+
   "#ckbx_fillrate,"+
   "#ckbx_pricecompliance"
).filter(':checked').first().val();

注意:由于获取集合中第一个元素的值,因此.first()甚至可能是不必要的。.val()为了易读性而留下。

于 2016-04-26T16:21:00.610 回答
1
$(function()
{
...
// IF (these are the only elements that id starts with ckbx_) THEN
    rptval = $('[id^=ckbx_]').filter(':checked').val();
// ELSE
    // this syntax is more maintainable than $('#ckbx_produceusage, #ckbx_fillrate, ... selectors à la queue');
    rptval = $('#ckbx_produceusage').add('#ckbx_fillrate').add('#ckbx_deliveryperformance').add('#ckbx_pricecompliance').filter(':checked').val();
// FI
...
});
于 2016-04-26T16:32:41.967 回答
0

在不更改 HTML 的情况下,您至少可以避免使用循环重复自己:

["#ckbx_produceusage", "#ckbx_deliveryperformance", "#ckbx_fillrate", "#ckbx_pricecompliance"].some(function(sel) {
    var e = $(sel);
    if (e.is(":checked")) {
        rptval = e.val();
        return true;
    }
});
setEmailAndGenerateValsForUnitReportPair(unitval, rptval)

您可能会更改您的 HTML,以便初始数组可以是查询而不是 ID 选择器的硬编码列表。

于 2016-04-26T16:17:53.663 回答
0

您还需要考虑没有检查的情况。永远不要假设某些东西已经设置好了。

function getValue(checkBoxes)
{
    for ( var i = 0; i < checkBoxes.length; i++ )
    {
        var name = "#ckbx_" + checkBoxes[ i ];

        if ( $( name ).is( "checked" ) ) return $( name ).val();
    }

    //None were checked
    return null; //Should throw exception
}

rptval = getValue( [ "produceusage", "deliveryperformance", "fillrate", "pricecompliance" ] );
于 2016-04-26T16:19:01.580 回答
0

尝试使用 .each()

  $("input[type='checkbox']").each(function() {
    var rptval = 0;
    if ($(this).is(":checked")) {
      rptval = 1;
    }
    setEmailAndGenerateValsForUnitReportPair(unitval, rptval);
  });
于 2016-04-26T16:32:36.503 回答