【问题标题】:jQuery returns checkboxes as all checked even if only one is checked即使只选中一个,jQuery也会返回所有选中的复选框
【发布时间】:2014-01-31 02:02:17
【问题描述】:

据此JSFIDDLE --

在过去的 48 小时里,我一直在疯狂地试图弄清楚这一点。除复选框外,一切正常。我在其中包含了导致问题的代码的隔离 sn-p。

在我创建了框(按下复选框按钮)并完成表单后,我成功地看到了code 并且能够将复选框序列化为 JSON - 但是,我最终得到了所有复选框的“开启”,即使如果只检查其中一个。

当我只选中一个(第一个框)和其他未选中的框,然后单击“保存”时,结果如下:

{"ck1":"on","ck2":"on","ck3":"on","submit1":"save"}

是什么导致结果失败?我在这段代码中做错了吗?

我们将不胜感激在确定问题方面提供帮助。
我的目标是在我第一次选中复选框时以这种格式查看 JSON:

{"ck1":"on","submit1":"save"} 或您建议的任何格式。

已编辑:

在我指定的函数下方找到提交事件:

 $('#form'+formnum).submit( function(e) {
e.preventDefault(e);
var data = {};

//Gathering the Data
$.each(this.elements, function(i, v){
        var input = $(v);
        data[input.attr("id")] = input.val();
 //delete data[button.attr("id")]; <-- cant' figure it out
//removeData[submit] <-- cant' figure it out
}); // end of $.each

var output =JSON.stringify(data);
$('#showurl').text(output);
}); //end of 'save' button function

JSFIDDLE:jsfiddle

【问题讨论】:

  • 即使您提供了 Fiddle,您也应该在问题本身中发布相关代码。仅链接的问题和答案不遵循网站指南,因为如果链接断开,它将变得毫无用处。
  • 你想要这个:jsfiddle.net/aamir/AJwXV/3 ?
  • 您的复选框缺少 id。
  • 数据[input.attr("id") || input.attr("name")] 应该修复它
  • @ÁlvaroG.Vicario - 感谢您的指点。已编辑。

标签: javascript jquery html json checkbox


【解决方案1】:

您从复选框中获取值,无论复选框的状态如何,该值始终相同。

检查元素的类型以获取复选框的状态:

if (input.is(':checkbox')) {
  if (input.is(':checked')) {
    data[input.attr("id")] = input.val();
  }
} else {
  data[input.attr("id")] = input.val();
}

如果您只想要复选框中的数据,您可以从一开始就过滤掉选中的复选框:

$(':checked', this).each(function(i, v){ data[v.id] = v.value; });

【讨论】:

  • 为什么要做 :checked 检查两次。他也没有复选框上的ID。 .attr('name') 应该可以工作。
  • @AamirAfridi:你在哪里看到:checked检查两次?如果再看一遍,你会发现复选框上其实有一个 id,但是没有名字,所以attr("id") 有效,attr("name") 无效。
  • @AamirAfridi:检查:checkbox是判断是否为复选框,检查:checked是判断是否勾选。如果您只进行一项检查,您会将未选中的复选框作为其他元素处理,并且它们最终会出现在数据对象中。由于代码必须处理的不仅仅是复选框,因此需要两个检查。
  • 如果你这样做 is(':checked') 就足够了 :) 在他的第一个版本中 jsfiddle.net/farondomenic/AJwXV/1 他有名字,jsfiddle.net/farondomenic/AJwXV/2 有每个复选框的 id
  • @AamirAfridi:在问题的示例中,包含提交按钮。一些服务器代码使用按钮中的值来确定请求来的原因,在这种情况下,必须包含它才能使服务器代码工作。
【解决方案2】:

您任意分配所有输入的值,实际上并没有检查checked 状态。

添加条件行:

data[input.attr("id")] = input.val();

类似:

if (/* (input is a checkbox and checkbox is checked) or input is not a checkbox*/) {
        data[input.attr("id")] = input.val();
}

单选按钮也需要例外。

【讨论】:

  • 收音机部分对我有用,没有问题。看到这个小提琴:jsfiddle.net/farondomenic/JF3Qv
  • 不,实际上并没有,它有完全相同的问题。如果您不检查任何单选按钮,它们将显示其值。如果您创建一个组,该值将是最后一个单选按钮,即使它未被选中。
猜你喜欢
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 2023-01-02
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 2012-05-08
  • 1970-01-01
相关资源
最近更新 更多