2012-04-03 141 views
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

the .map() method doco.map()返回“一个jQuery包裹阵列”。既然你想要一个对象,你可以,而不是做这样的事情:

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

注意到,如果你有相同名称的复选框(这是有效的,只要HTML表单去),那么你的对象将只保留价值每个名称的最后一个复选框。

+0

Upvoted一个解决方案减去我的责骂。 :) – zetlen 2012-04-03 22:36:49

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; 
} 
1

试试这个:

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

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

+1

请注意,如果您使用'this.name'和'this.checked',而不是使用'$(this)'创建新的jQuery对象(两次!),则可以使这更高效且更易于阅读。 – nnnnnn 2012-04-03 22:34:36