通过名称和值用JSON数据填充表单

时间:2020-03-18 14:24:38

标签: javascript jquery forms serialization

以下是我使用name属性和值来捕获Web表单的值并将其保存到JSON的方法。

如何使用namevalue用相同的格式从捕获的JSON数据中重新填充表单。 (上下文:我将存储已保存的json,稍后调用以重新填充所述表单)

我将代码另存为JSON的代码:

$.fn.serializeObject = function()
{
    var o = {};
    var a = this.serializeArray();
    $.each(a, function() {
        if (o[this.name] !== undefined) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};

$(function() {
    $('form#saveTemp').submit(function() {
        alert(JSON.stringify($('form').serializeObject()));
        return false;
    });
});

其中jsfiddle

1 个答案:

答案 0 :(得分:1)

使用帮助jquery.serialize概念来检查我已经用于我的项目的内容

概念:

  1. 您可以使用value。但是在某些情况下,不能使用data-value来代替值
  2. 如果您需要带有特殊动作的特殊类,请使用elem.hasClass方法

$.fn.serializeObject = function() {
  var arr = $(this).find('input,textarea,select').map(function(a, elem) {
    if ($.trim($(elem).attr('name'))) {
      if ($(elem).is('input[type=radio]') || $(elem).is('input[type=checkbox]')) {
        if ($(elem).is(':checked')) {
          return ({
            [$(elem).attr('name')]: $(elem).attr('data-value') ? $.trim($(elem).attr('data-value')) : $.trim($(elem).val())
          });
        } else {
          if ($(elem).is('input[type=checkbox]')) {
            return ({
              [$(elem).attr('name')]: ""
            });
          }
        }
      } else if ($(this).hasClass('datepicker')) {
        return ({
          [$(elem).attr('name')]: ($(elem).val().trim() ? $(elem).val().toString().split('-').reverse().join('-') : "")
        });
      } else {

        return ({
          [$(elem).attr('name')]: $(elem).attr('data-value') ? $.trim($(elem).attr('data-value')) : $.trim($(elem).val())
        });
      }
    }
  }).get();
  arr = arr.reduce((a, b) => (a[Object.keys(b)[0]] = Object.values(b)[0], a), {});
  return arr;
}

$(function() {
  $('form#saveTemp').submit(function() {
    alert(JSON.stringify($('form').serializeObject()));
    return false;
  });
});
form {
  line-height: 2em;
}

p {
  margin: 5px 0;
}

h2 {
  margin: 10px 0;
  font-size: 1.2em;
  font-weight: bold
}

#result {
  margin: 10px;
  background: #eee;
  padding: 10px;
  height: 40px;
  overflow: auto;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="saveTemp">
  <div id='polygon-styles' class='clear' data-bind="visible:polygonFeature">
    <div class="left">

      <div class="marg clear of-h">
        <div class="w100 left">
          <label>Style Name</label>
        </div>
        <div class="left">
          <input id='style-name' class='w150' type="text" data-text-field="name" data-value-field="value" name="styleName">
        </div>
      </div>

      <div class="marg clear of-h">
        <div class="w100 left">
          <label>Fill Type</label>
        </div>
        <div class="left">
          <select id='style-type' class='w150' data-role="dropdownlist" data-bind="source:pgFillTypes,value:pgFillType" data-text-field="name" data-value-field="value" name="fillType">
          </select>
        </div>
      </div>
      <div class="marg clear of-h">
        <div class="w100 left">
          <label>Fill Color</label>
        </div>
        <div class="left">
          <input class="w100" data-role="colorpicker" data-bind="value:pgFillColor,enabled:pgFillColActive" name="fillColor">
        </div>
      </div>
      <div class="marg clear of-h">
        <div class="w100 left">
          <label>Transparency</label>
        </div>
        <div class="left">
          <input type='number' class='w100' data-role="numerictextbox" data-format="p" data-min="0" data-max="1" data-step="0.1" data-bind="value:pgFillTrans,enabled:pgFillTransActive" name="fillTrans" />
        </div>
      </div>
    </div>
    <div class="left">
      <div class="marg clear of-h">
        <div class="w100 left">
          <label>Outline Type</label>
        </div>
        <div class="left">
          <select id='polygon-outline-style-type' class='w150' data-role="dropdownlist" data-bind="source:plTypes,value:pgOutlineType" data-text-field="name" data-value-field="value" name="outlineType">
          </select>
        </div>
      </div>
      <div class="marg clear of-h">
        <div class="w100 left">
          <label>Outline Width</label>
        </div>
        <div class="left">
          <input type='number' class='w100' data-role="numerictextbox" data-format="n" data-min="1" data-bind="value:pgOutlineWidth" name="outlineWidth" />
        </div>
      </div>
      <div class="marg clear of-h">
        <div class="w100 left">
          <label>Outline Color</label>
        </div>
        <div class="left">
          <input class="w100" data-role="colorpicker" data-bind="value:pgOutlineColor" name="outlineColor">
        </div>
      </div>

      <button class="save-temp-btn" input type="submit" value="submit">Save as Template</button>

      <div class="left">
        <div class="marg clear of-h">
          <div class="w100 left">
            <label>Apply Shared Template</label>
          </div>
          <div class="left">
            <select id='polygon-shared-templates' class='w150' data-role="dropdownlist" data-bind="" data-text-field="name" data-value-field="value">
            </select>
          </div>
        </div>
      </div>
    </div>
  </div>
  
<button type="submit" id="populateForm">Populate
        </button>
</form>