2012-04-03 6 views
0

私はチェックボックスの名前と値のオブジェクトを取得しようとしています。私はこのフォームがあるとします。チェックボックス値のobjを返します

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

第1および第3がチェックされていると仮定するとし、私はこれが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

を。あなたは(限りHTMLフォームが行くように有効である)同じ名前のチェックボックスを持っているならば、あなたのオブジェクトは値だけを維持することに留意

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

:あなたがあなたの代わりにこのような何かを行うことができますオブジェクトを望んでいることを考えると各名前の最後のチェックボックスの

+0

Upvotedを解決マイナス私chidingため。 :) – zetlen

1

あなたは連想配列構文を使用してプロパティを設定してみてくださいすることができますob["property"] = ...

この作業フィドルを参照してください:.map()戻り、the .map() method docoによる "jQueryの-ラップ配列を" http://jsfiddle.net/tuando/JwYFz/

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)'で新しいjQueryオブジェクト(2回!)を作成するのではなく、 'this.name'と' this.checked'を使用すれば、これをもっと効率的に読みやすくすることができます。 – nnnnnn

関連する問題