返回复选框值的obj

时间:2012-04-03 22:14:33

标签: javascript jquery forms

我正在尝试获取复选框名称和值的对象。假设我有这种形式:

<form>
<input type="checkbox" name="email" />
<input type="checkbox" name="name" />
<input type="checkbox" name="hi" />

假设第一个和第三个被检查,我想要这个obj:

{ email: 1, name: 0, hi: 1 }

这是我试过的:

$(':checkbox').map(function() { return this.name + '=' + (this.checked ? 1 : 0) } }).get();

这让我:

['email=1', 'name=0', 'hi=1']

但我不知道从这里做了什么。

我是不是错了?

4 个答案:

答案 0 :(得分:4)

根据the .map() method doco.map()返回“jQuery包装的数组”。鉴于你想要一个对象,你可以改为做这样的事情:

var checkboxes = {};
$(':checkbox').each(function() {
    checkboxes[this.name] = this.checked ? 1 : 0;
});

注意如果您有相同名称的复选框(对于html表单而言是有效的),那么您的对象将只保留每个名称的最后一个复选框的值。

答案 1 :(得分:1)

您可以尝试使用关联数组语法设置属性:ob["property"] = ...

看到这个工作小提琴:http://jsfiddle.net/tuando/JwYFz/

答案 2 :(得分:1)

是的,你要解决这个错误。通过使用'=',您希望函数返回JavaScript代码,然后使用eval运行。这不是JavaScript的运作方式。由于您将this.name与字符串和数字连接起来,JavaScript会执行其隐式type coercion并从函数返回一个字符串,因此您将获得一个字符串数组。

.map()函数将始终返回数组;对于不返回数组的其他操作,应使用泛型.each()迭代器。

这是一个快速插件,可以满足您的需求。

$.fn.serializeCheckboxes = function() {

    var ret = {};
    this.each(function(ix,elm) {
        ret[elm.name] = elm.checked ? 1 : 0;
    });
    return ret;
}

答案 3 :(得分:1)

试试这个:

$('input[type="checkbox"]').each(function() {
        var name = $(this).attr('name');
        obj[name] = $(this).is(':checked') ? 1 : 0;
 });

http://jsfiddle.net/T7fja/1/