从表单字段创建JSON-jQuery

斯托伊洛夫

我想做的是从html表单创建JSON。然后使用此脚本(Formulator- https://github.com/walpolea/Formulator)对其进行可视化。

我可以使用serializeArray()将值和名称导出到JSON。但是,为了使Formulator正常工作,我必须创建具有如下所示特定结构的JSON。

{
   "custom1":"some value",
   "custom2":"some value",
   "inputs":[
      {
         "label":{
            "content":"Input: ",
            "class":"inputLabel"
         },
         "id":"first_name",
         "name":"first_name",
         "type":"text",
         "size":"50"
      },
      {
         "label":{
            "content":"Select: ",
            "class":"inputLabel"
         },
         "id":"FirstSelect",
         "name":"FirstSelect",
         "type":"select",
         "options":[
            {
               "value":"One"
            },
            {
               "value":"Two"
            }
         ]
      },
      {
         "label":{
            "content":"Checkboxes: ",
            "class":"inputLabel"
         },
         "id":"checkbox",
         "name":"somevalue",
         "type":"checkbox",
         "options":[
            {
               "value":"Dog",
               "name":"pet"
            },
            {
               "value":"Cat",
               "name":"pet"
            },
            {
               "value":"Bird    ",
               "name":"pet"
            }
         ]
      },
      {
         "id":"submit",
         "name":"submit",
         "type":"submit",
         "value":"Submit"
      }
   ]
}

我的问题出在"inputs":[]JSON部分。我不知道该怎么做。同样,在选择元素的情况下,它必须采用所有选项,而不仅仅是选择的选项。复选框也同样有效。

这是演示: https : //jsfiddle.net/largan/avz672s4/71/

$(document).ready(function() {
        $('#submit').on('click', function () {
            $('#result').html('');
                $('#result').append(
                    $('<pre>').text(JSON.stringify(_get_values($('#form')), null, 2))
      )
      event.preventDefault();
                });
            });
function _get_values(form)
        {
            let data = {
      "custom1":"some value",
        "custom2":"some value"
      };
            $(form).find('input, textarea, select').each(function(x, field) {

                    if (field.name) {
                        if (field.name.indexOf('[]') > 0) {
                            if (!$.isArray(data[field.name])) {
                                data[field.name] = new Array();
                                data['type'] = 'select';
                            }
                            for (let i = 0; i < field.selectedOptions.length; i++) {
                                data[field.name].push(field.selectedOptions[i].value);
                            }
                        } else {
                            data[field.name] = field.value;
              data['type'] = 'input';
                        }
                    }
            });
            return data
        }
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Convert form to JSON</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"> </script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"> </script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"> </script>
    <script src="https://code.jquery.com/jquery-1.11.3.js"> </script>
    <script src="https://code.jquery.com/ui/1.11.3/jquery-ui.js"> </script>
</head>
<body>
<div class="container">
  <h2>Form to JSON</h2>
  <p></p>
  <form id="form">
    <div class="form-group">
      <label for="first_name" class="inputLabel">Input:</label>
      <input type="text" name="first_name" id="first_name" class="form-control" size="50">
      <br>
      <label for="select" class="inputLabel">Select:</label>
      <select multiple class="form-control" id="FirstSelect" name="FirstSelect[]" size="2">
        <option>One</option>
        <option>Two</option>
      </select>
      <br>
      <label for="select" class="inputLabel">Select:</label>
      <select multiple class="form-control" id="SecondSelect" name="SecondSelect[]" size="3">
        <option>3</option>
        <option>4</option>
        <option>5</option>
      </select>
      <br>
      <label for="pet" class="inputLabel">Checkboxes:</label>

<div class="form-check-inline">
      <input type="checkbox" id="checkbox[]" name="pet" value="Dog" /> Dog 
      </div>
<div class="form-check-inline">
      <input type="checkbox" id="checkbox[]" name="pet" value="Cat" /> Cat 
      </div>
<div class="form-check-inline">
      <input type="checkbox" id="checkbox[]" name="pet" value="Bird" /> Bird 
      </div>
    </div>
      <button id="submit" name="submit" type="submit"  class="btn btn-primary">Submit</button>

  </form>

<p></p>
  <div class="alert alert-info" id="result" ></div>

</div>

</body>
</html>

我要实现的是单击“提交”后创建所需的JSON。

斯瓦蒂

您首先需要检查输入是否在json数组中,然后使用创建新的JSON对象{}使用与其他值相同的值向该JSON对象添加值yourjsonname["value"]="something"现在,要遍历所有内容,checkboxes您需要使用一些循环,然后使用$(this).val()将该值推送到json上,该json是在select-box相同的操作之前创建的。

演示代码

$(document).ready(function() {
  $('#submit').on('click', function() {
    $('#result').html('');
    $('#result').append(
      $('<pre>').text(JSON.stringify(_get_values($('#form')), null, 2))
    )
    event.preventDefault();
  });
});

function _get_values(form) {
  let dataa = {
    "custom1": "some value",
    "custom2": "some value"
  };
  //create input json array
  dataa['input'] = new Array();

  $(form).find('input, textarea, select').each(function(x, field) {

    if (field.id) {
      if (field.id.indexOf('[]') > -1) {
        //check if the input exist inside json array
        var existss = $(dataa.input)
          .filter(function(i, n) {
            return n.id === field.id;
          });
        //if not exist
        if (typeof existss[0] == 'undefined') {
          var label = {}; //for label
          var data = {}; //for other data
          data['type'] = field.type;
          data['name'] = field.name;
          data['id'] = field.id;
          data["options"] = new Array();
          if (field.type == "select-multiple") {

            ///add value for label and option
            label["content"] = $(this).prev("label").attr("for")
            label["class"] = $(this).prev("label").attr("class")
            for (let i = 0; i < field.length; i++) {
              var option_inside = {}; //create json object
              option_inside["value"] = field[i].value;
              data["options"].push(option_inside) //push in main array
            }
          }
          if (field.type == "checkbox") {
            //add value for checkeboxs and labl
            label["content"] = $(this).closest("div").prev("label").attr("for")
            label["class"] = $(this).closest("div").prev("label").attr("class")

            $("input[name=" + field.name + "]").each(function() {
              var option_inside = {}; //create json objct
              option_inside["value"] = $(this).val();
              option_inside["name"] = field.name;
              data["options"].push(option_inside) //push option in main array(options)
            })

          }
          data["label"] = label //add label created
          dataa['input'].push(data) //finally push created json to main json array

        }

      } else {
        //add value and label 
        var label = {};
        label["content"] = $(this).prev("label").attr("for")
        label["class"] = $(this).prev("label").attr("class")
        var data = {}
        data["label"] = label
        data[field.name] = field.name;
        data['type'] = 'input';
        data['id'] = field.id;
        data['size'] = field.size;
        dataa['input'].push(data)
      }
    }
  });
  return dataa
}
<!DOCTYPE html>
<html lang="en">

<head>
  <title>Convert form to JSON</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js">
  </script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js">
  </script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js">
  </script>
  <script src="https://code.jquery.com/jquery-1.11.3.js">
  </script>
  <script src="https://code.jquery.com/ui/1.11.3/jquery-ui.js">
  </script>
</head>

<body>
  <div class="container">
    <h2>Form to JSON</h2>
    <p></p>
    <form id="form">
      <div class="form-group">
        <label for="first_name" class="inputLabel">Input:</label>
        <input type="text" name="first_name" id="first_name" class="form-control" size="50">
        <br>
        <label for="select" class="inputLabel">Select:</label>
        <select multiple class="form-control" id="FirstSelect[]" name="FirstSelect[]" size="2">
          <option>One</option>
          <option>Two</option>
        </select>
        <br>
        <label for="select" class="inputLabel">Select:</label>
        <select multiple class="form-control" id="SecondSelect[]" name="SecondSelect[]" size="3">
          <option>3</option>
          <option>4</option>
          <option>5</option>
        </select>
        <br>

        <label for="pet" class="inputLabel">Checkboxes:</label>

        <div class="form-check-inline">
          <input type="checkbox" id="checkbox[]" name="pet" value="Dog" /> Dog
        </div>
        <div class="form-check-inline">
          <input type="checkbox" id="checkbox[]" name="pet" value="Cat" /> Cat
        </div>
        <div class="form-check-inline">
          <input type="checkbox" id="checkbox[]" name="pet" value="Bird" /> Bird
        </div>
      </div>
      <button id="submit" name="submit" type="button" class="btn btn-primary">Submit</button>

    </form>

    <p></p>
    <div class="alert alert-info" id="result"></div>

  </div>

</body>

</html>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用jQuery将JSON值返回到表单字段

来自分类Dev

如何使用jQuery从动态创建的表单字段中使用值创建多维数组?

来自分类Dev

使用jQuery显示隐藏表单字段

来自分类Dev

Ajax填充表单字段的jQuery修改

来自分类Dev

克隆表单字段并维护jQuery功能

来自分类Dev

使用jQuery删除表单字段

来自分类Dev

jQuery提交其他表单字段

来自分类Dev

使用jQuery显示隐藏的表单字段

来自分类Dev

表单字段jquery上的动画

来自分类Dev

尝试使用jQuery验证表单字段

来自分类Dev

使用 jQuery 拆分表单字段值

来自分类Dev

jQuery - 按名称查找表单字段

来自分类Dev

使用jquery将所有表单字段作为JSON提交到API

来自分类Dev

使用jQuery追加表单字段的值到表单动作?

来自分类Dev

多步表单字段与jQuery切换字段集

来自分类Dev

如果表单字段为空,如何添加类(或更改表单字段的类)?jQuery的

来自分类Dev

jQuery序列化-获取表单字段值问题

来自分类Dev

使用CSS和jQuery隐藏/显示表单字段

来自分类Dev

jQuery:如何检查表单字段的值

来自分类Dev

jQuery确保所有表单字段均已填写

来自分类Dev

AJAX PHP变量以填充表单字段jquery

来自分类Dev

jQuery将文本从<li>拉到隐藏的表单字段

来自分类Dev

jQuery-显示/隐藏隐藏的输入表单字段

来自分类Dev

jQuery选择下拉菜单-插入隐藏的表单字段

来自分类Dev

使用jQuery获取除按钮以外的表单字段

来自分类Dev

使用CSS和jQuery隐藏/显示表单字段

来自分类Dev

jQuery警报,如果ID为空表单字段

来自分类Dev

jQuery如何展开和折叠表单字段

来自分类Dev

验证jQuery表单字段组合的更好方法