form serialize javascript (no framework)

后端 未结 23 1387
一生所求
一生所求 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:57

    For debugging purposes this might help you:

    function print_form_data(form) {
        const form_data = new FormData(form);
    
        for (const item of form_data.entries()) {
            console.log(item);
        }
    
        return false;
    }
    
    0 讨论(0)
  • 2020-11-22 16:59

    Works in all browsers.

    const formSerialize = formElement => {
      const values = {};
      const inputs = formElement.elements;
    
      for (let i = 0; i < inputs.length; i++) {
        values[inputs[i].name] = inputs[i].value;
      }
      return values;
    }
    
    const dumpValues = form => () => {
      
      const r = formSerialize(form);
      console.log(r);
      console.log(JSON.stringify(r));
    }
    
    const form = document.querySelector('form');
    
    dumpValues(form)();
    
    form.addEventListener('change',dumpValues(form));
    <form action="/my-handling-form-page" method="post">
      <div>
        <label for="name">Name:</label>
        <input type="text" id="name" name="user_name" value="John">
      </div>
      <div>
        <label for="mail">E-mail:</label>
        <input type="email" id="mail" name="user_mail" value="john@jonhson.j">
      </div>
      <div>
        <label for="interests">Interest:</label>
        <select required=""  id="interests" name="interests">
          <option value="" selected="selected">- None -</option>
          <option value="drums">Drums</option>
          <option value="js">Javascript</option>
          <option value="sports">Sports</option>
          <option value="trekking">Trekking</option>
        </select>
      </div>
      <div>
        <label for="msg">Message:</label>
        <textarea id="msg" name="user_message">Hello My Friend</textarea>
      </div>
    </form>

    0 讨论(0)
  • 2020-11-22 17:01

    A refactored version of @SimonSteinberger's code using less variables and taking advantage of the speed of forEach loops (which are a bit faster than fors)

    function serialize(form) {
        var result = [];
        if (typeof form === 'object' && form.nodeName === 'FORM')
            Array.prototype.slice.call(form.elements).forEach(function(control) {
                if (
                    control.name && 
                    !control.disabled && 
                    ['file', 'reset', 'submit', 'button'].indexOf(control.type) === -1
                )
                    if (control.type === 'select-multiple')
                        Array.prototype.slice.call(control.options).forEach(function(option) {
                            if (option.selected) 
                                result.push(encodeURIComponent(control.name) + '=' + encodeURIComponent(option.value));
                        });
                    else if (
                        ['checkbox', 'radio'].indexOf(control.type) === -1 || 
                        control.checked
                    ) result.push(encodeURIComponent(control.name) + '=' + encodeURIComponent(control.value));
            });
            return result.join('&').replace(/%20/g, '+');
    }
    
    0 讨论(0)
  • 2020-11-22 17:02

    Here is pure JavaScript approach:

    var form = document.querySelector('form');
    var data = new FormData(form);
    var req = new XMLHttpRequest();
    req.send(data);
    

    Though it seems to be working only for POST requests.

    https://developer.mozilla.org/en-US/docs/Web/API/FormData

    0 讨论(0)
  • 2020-11-22 17:03

    If you are looking to serialize the inputs on an event. Here's a pure JavaScript approach I use.

    // serialize form
    var data = {};
    var inputs = [].slice.call(e.target.getElementsByTagName('input'));
    inputs.forEach(input => {
      data[input.name] = input.value;
    });
    

    Data will be a JavaScript object of the inputs.

    0 讨论(0)
  • 2020-11-22 17:07

    Here's a slightly modified version of TibTibs':

    function serialize(form) {
        var field, s = [];
        if (typeof form == 'object' && form.nodeName == "FORM") {
            var len = form.elements.length;
            for (i=0; i<len; i++) {
                field = form.elements[i];
                if (field.name && !field.disabled && field.type != 'file' && field.type != 'reset' && field.type != 'submit' && field.type != 'button') {
                    if (field.type == 'select-multiple') {
                        for (j=form.elements[i].options.length-1; j>=0; j--) {
                            if(field.options[j].selected)
                                s[s.length] = encodeURIComponent(field.name) + "=" + encodeURIComponent(field.options[j].value);
                        }
                    } else if ((field.type != 'checkbox' && field.type != 'radio') || field.checked) {
                        s[s.length] = encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value);
                    }
                }
            }
        }
        return s.join('&').replace(/%20/g, '+');
    }
    

    Disabled fields are discarded and names are also URL encoded. Regex replace of %20 characters takes place only once, before returning the string.

    The query string is in identical form to the result from jQuery's $.serialize() method.

    0 讨论(0)
提交回复
热议问题