0

我正在尝试获取复选框名称和值的对象。假设我有这个表格:

<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

4 回答 4

4

根据方法 doco,返回.map().map()一个 jQuery 包装的数组”。鉴于您想要一个对象,您可以改为执行以下操作:

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

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

于 2012-04-03T22:25:57.773 回答
1

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

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

于 2012-04-03T22:24:50.143 回答
1

是的,你这样做是非常错误的。从您的使用来看,您'='似乎希望该函数返回 JavaScript 代码,然后使用eval. 这不是 JavaScript 的运作方式。由于您要连接this.name字符串和数字,因此 JavaScript 会执行其隐式类型强制并从函数返回一个字符串,因此您会得到一个字符串数组。

.map()函数将始终返回一个数组;对于不返回数组的杂项操作,您应该使用泛型.each()迭代器。

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

$.fn.serializeCheckboxes = function() {

    var ret = {};
    this.each(function(ix,elm) {
        ret[elm.name] = elm.checked ? 1 : 0;
    });
    return ret;
}
于 2012-04-03T22:27:51.593 回答
1

试试这个:

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

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

于 2012-04-03T22:28:33.393 回答