LoginSignup
1
4

More than 5 years have passed since last update.

javascriptでフォームの内容をいい感じにJSONにしてくれる関数作りました

Last updated at Posted at 2016-12-09

経緯

普通に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);
    }
}

こんな感じです。
大した出来でもないのですが、自分が今後も使いそうなので、投稿しておきます。


1
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4