###経緯
普通にGETなりPOSTなりしても良いのだけど、サーバー側でJSONで処理する事が増えてきたし、APIの通信テストページみたいなのをHTMLで作ってたら、こういうニーズが出てきました。
すごく局所的なニーズかなw
$("#form").serializeArray();
でも良かったんだけど、これだと
・チェックの入っていないチェックボックスが取得できない(パラメータ数が変わってしまう)
・{name:"aaa", value:"bbb"}
形式が使いにくい(APIテストとしては、入力形式が変わってしまう)
・multipleのselectboxで同じnameのパラメータが複数送られてしまう
という問題があったので、
{param1:"val1","param2":"val2",}
となるような関数を作ったのです。
ネットでググると、$("#form").serializeArray();
した後に、ループで回してるのが多かったのですが、multipleのselectboxがArrayで入ってくるように対応したかったので、まとめて一つの機能にしてみました。
###ソース
/**
* フォームの内容を成形されたJSONにして返す
* チャックボックスは空白ならfalse としてパラメータに追加
*
* @param {Jquery} form フォームオブジェクト
* @param {Boolean} isReturnArray 戻り値を配列にするか 無指定でfalse
* @returns {Array|String} JsonのStringかArray
*/
function formToJson(form,isReturnArray){
isReturnArray === undefined ? false : isReturnArray;
var inputs = form.find('input,select,textarea');
var inputValues = {};
inputValues['form_id'] = form.attr('id');
inputs.each(function (){
var type = $(this).attr('type');
var tag = $(this).prop('tagName');
var name = $(this).attr('name');
var checkd = $(this).prop("checked");
if(tag === 'SELECT'){
var options = $(this).find('option');
inputValues[name] = [];
options.each(function(){
var checkd = $(this).prop("checked");
var selected = $(this).prop("selected");
if(checkd || selected){
inputValues[name].push($(this).val());
}
});
}else if(type === 'checkbox' ){
inputValues[name]=checkd;
}else if(type === 'radio'){
if(checkd){
inputValues[name]=$(this).val();
}
}else{
inputValues[name]=$(this).val();
}
});
if(isReturnArray){
return inputValues;
}else{
return JSON.stringify(inputValues,null,2);
}
}
こんな感じです。
大した出来でもないのですが、自分が今後も使いそうなので、投稿しておきます。