form serialize javascript (no framework)

后端 未结 23 1612
一生所求
一生所求 2020-11-22 16:07

Wondering is there a function in javascript without jquery or any framework that allows me to serialize the form and access the serialized version?

23条回答
  •  礼貌的吻别
    2020-11-22 16:44

    Improving upon David Lemon's answer.

    This converts form data to JSON and allows you to set the form from a data object.

    const main = () => {
      const form = document.forms['info'];
      const data = {
        "user_name"       : "John",
        "user_email"      : "john@jonhson.com",
        "user_created"    : "2020-03-24",
        "user_age"        : 42,
        "user_subscribed" : true,
        "user_interests"  : "sports",
        "user_message"    : "Hello My Friend"
      };
    
      populateForm(form, data);
      updateJsonView(form);
      form.addEventListener('change', (e) => updateJsonView(form));
    }
    
    const getFieldValue = (field, opts) => {
      let type = field.getAttribute('type');
      if (type) {
        switch (type) {
          case 'checkbox':
            return field.checked;
          case 'number':
            return field.value.includes('.')
              ? parseFloat(field.value)
              : parseInt(field.value, 10);
        }
      }
      if (opts && opts[field.name] && opts[field.name].type) {
        switch (opts[field.name].type) {
          case 'int':
            return parseInt(field.value, 10);
          case 'float':
            return parseFloat(field.value);
        }
      }
      return field.value;
    }
    
    const setFieldValue = (field, value) => {
      let type = field.getAttribute('type');
      if (type) {
        switch (type) {
          case 'checkbox':
            field.checked = value;
            break;
          default:
            field.value = value;
            break;
        }
      } else {
        field.value = value;
      }
    }
    
    const extractFormData = (form, opts) => {
      return Array.from(form.elements).reduce((data, element) => {
        return Object.assign(data, { [element.name] : getFieldValue(element, opts) });
      }, {});
    };
    
    const populateForm = (form, data) => {
      return Array.from(form.elements).forEach((element) => {
        setFieldValue(element, data[element.name]);
      });
    };
    
    const updateJsonView = (form) => {
      let fieldOptions = {};
      let formData = extractFormData(form, fieldOptions);
      let serializedData = JSON.stringify(formData, null, 2);
      document.querySelector('.json-view').textContent = serializedData;
    };
    
    main();
    .form-field {
      margin-bottom: 0.5em;
    }
    
    .form-field label {
      display: inline-block;
      font-weight: bold;
      width: 7em;
      vertical-align: top;
    }
    
    .json-view {
      position: absolute;
      top: 0.667em;
      right: 0.667em;
      border: thin solid grey;
      padding: 0.5em;
      white-space: pre;
      font-family: monospace;
      overflow: scroll-y;
      max-height: 100%;
    }

提交回复
热议问题