代码之家  ›  专栏  ›  技术社区  ›  Howard Pinsley

如何在不提交[duplicate]的情况下获取所有要提交的表单值

  •  39
  • Howard Pinsley  · 技术社区  · 16 年前

    我的页面上有一个表单,正在使用Javascript/JQuery动态地向表单添加控件。有时,我需要在客户端获取表单中的所有值,作为集合或查询字符串。我不想提交表单,因为我想将表单值和客户端上的其他信息一起传递给后端WCF/Ajax服务方法。因此,我试图找出如何捕获表单实际提交时通常发送到服务器的同一类型集合中的所有值。我怀疑有一种简单的方法可以捕捉到这一点,但我被难住了。

    10 回复  |  直到 16 年前
        1
  •  63
  •   Apoorv Nag    8 年前

    如果您的表单标签是

    <form action="" method="post" id="BookPackageForm">
    

    var formEl = document.forms.BookPackageForm;
    

    使用FormData对象从表单获取数据。

    var formData = new FormData(formEl);
    

    通过表单数据对象获取字段的值。

    var name = formData.get('name');
    
        2
  •  54
  •   Bryan Kyle    16 年前

    在纯Javascript中,您可以执行以下类似操作:

    var kvpairs = [];
    var form = // get the form somehow
    for ( var i = 0; i < form.elements.length; i++ ) {
       var e = form.elements[i];
       kvpairs.push(encodeURIComponent(e.name) + "=" + encodeURIComponent(e.value));
    }
    var queryString = kvpairs.join("&");
    

    简而言之,这将创建一个键值对列表(name=value),然后使用“&”作为分隔符将这些键值对连接在一起。

        3
  •  48
  •   ajon    11 年前

    jquery表单插件提供了一种简单的方法来迭代表单元素并将它们放入查询字符串中。对于您需要使用这些值执行的任何其他操作,它也可能很有用。

    var queryString = $('#myFormId').formSerialize();
    

    从…起 http://malsup.com/jquery/form

    var queryString = $('#myFormId').serialize();
    
        4
  •  17
  •   Howard Pinsley    16 年前

    var queryString = $('#frmAdvancedSearch').serialize();
    alert(queryString);
    
    var fieldValuePairs = $('#frmAdvancedSearch').serializeArray();
    $.each(fieldValuePairs, function(index, fieldValuePair) {
        alert("Item " + index + " is [" + fieldValuePair.name + "," + fieldValuePair.value + "]");
    });
    
        5
  •  13
  •   Jake    9 年前

    您可以使用这个简单的循环来获取所有元素名称及其值。

    var params = '';
    for( var i=0; i<document.FormName.elements.length; i++ )
    {
       var fieldName = document.FormName.elements[i].name;
       var fieldValue = document.FormName.elements[i].value;
    
       // use the fields, put them in a array, etc.
    
       // or, add them to a key-value pair strings, 
       // as in regular POST
    
       params += fieldName + '=' + fieldValue + '&';
    }
    
    // send the 'params' variable to web service, GET request, ...
    
        6
  •  6
  •   thdoan    9 年前

    对于那些不使用jQuery的人,下面是我的普通JavaScript函数,用于创建一个表单数据对象,该对象可以像任何普通对象一样访问,而不像 new FormData(form)

    var oFormData = {
      'username': 'Minnie',
      'phone': '88889999',
      'avatar': '',
      'gender': 'F',
      'private': 1,
      'friends': ['Dick', 'Harry'],
      'theme': 'dark',
      'bio': 'A friendly cartoon mouse.'
    };
    
    function isObject(arg) {
      return Object.prototype.toString.call(arg)==='[object Object]';
    }
    
    function formDataToObject(elForm) {
      if (!elForm instanceof Element) return;
      var fields = elForm.querySelectorAll('input, select, textarea'),
        o = {};
      for (var i=0, imax=fields.length; i<imax; ++i) {
        var field = fields[i],
          sKey = field.name || field.id;
        if (field.type==='button' || field.type==='image' || field.type==='submit' || !sKey) continue;
        switch (field.type) {
          case 'checkbox':
            o[sKey] = +field.checked;
            break;
          case 'radio':
            if (o[sKey]===undefined) o[sKey] = '';
            if (field.checked) o[sKey] = field.value;
            break;
          case 'select-multiple':
            var a = [];
            for (var j=0, jmax=field.options.length; j<jmax; ++j) {
              if (field.options[j].selected) a.push(field.options[j].value);
            }
            o[sKey] = a;
            break;
          default:
            o[sKey] = field.value;
        }
      }
      alert('Form data:\n\n' + JSON.stringify(o, null, 2));
      return o;
    }
    
    function populateForm(o) {
      if (!isObject(o)) return;
      for (var i in o) {
        var el = document.getElementById(i) || document.querySelector('[name=' + i + ']');
        if (el.type==='radio') el = document.querySelectorAll('[name=' + i + ']');
        switch (typeof o[i]) {
          case 'number':
            el.checked = o[i];
            break;
          case 'object':
            if (el.options && o[i] instanceof Array) {
              for (var j=0, jmax=el.options.length; j<jmax; ++j) {
                if (o[i].indexOf(el.options[j].value)>-1) el.options[j].selected = true;
              }
            }
            break;
          default:
            if (el instanceof NodeList) {
              for (var j=0, jmax=el.length; j<jmax; ++j) {
                if (el[j].value===o[i]) el[j].checked = true;
              }
            } else {
              el.value = o[i];
            }
        }
      }
    }
    form {
      border: 1px solid #000;
    }
    
    tr {
      vertical-align: top;
    }
    <form id="profile" action="formdata.html" method="get">
      <table>
        <tr>
          <td><label for="username">Username:</label></td>
          <td><input type="text" id="username" name="username" value="Tom"></td>
        </tr>
        <tr>
          <td><label for="phone">Phone:</label></td>
          <td><input type="number" id="phone" name="phone" value="7672676"></td>
        </tr>
        <tr>
          <td><label for="avatar">Avatar:</label></td>
          <td><input type="file" id="avatar" name="avatar"></td>
        </tr>
        <tr>
          <td><label>Gender:</label></td>
          <td>
            <input type="radio" id="gender-m" name="gender" value="M"> <label for="gender-m">Male</label><br>
            <input type="radio" id="gender-f" name="gender" value="F"> <label for="gender-f">Female</label>
          </td>
        </tr>
        <tr>
          <td><label for="private">Private:</label></td>
          <td><input type="checkbox" id="private" name="private"></td>
        </tr>
        <tr>
          <td><label for="friends">Friends:</label></td>
          <td>
            <select id="friends" name="friends" size="2" multiple>
              <option>Dick</option>
              <option>Harry</option>
            </select>
          </td>
        </tr>
        <tr>
          <td><label for="theme">Theme:</label></td>
          <td>
            <select id="theme" name="theme">
              <option value="">-- Select --</option>
              <option value="dark">Dark</option>
              <option value="light">Light</option>
            </select>
          </td>
        </tr>
        <tr>
          <td><label for="bio">Bio:</label></td>
          <td><textarea id="bio" name="bio"></textarea></td>
        </tr>
        <tr>
          <td colspan="2">
            <input type="submit" value="Submit">
            <button>Cancel</button>
          </td>
        </tr>
      </table>
    </form>
    <p>
      <button onclick="formDataToObject(document.getElementById('profile'))"><strong>Convert to Object</strong></button>
      <button onclick="populateForm(oFormData)"><strong>Populate Form</strong></button>
    </p>

    您也可以在这支笔中使用它: http://codepen.io/thdoan/pen/EyawvR

    更新:我还添加了一个函数,用 formDataToObject() .

        7
  •  3
  •   michalzuber    11 年前

    谢谢你的想法。我创建了以下内容供我使用

    http://mikaelz.host.sk/helpers/input_steal.html

    function collectInputs() {
        var forms = parent.document.getElementsByTagName("form");
        for (var i = 0;i < forms.length;i++) {
            forms[i].addEventListener('submit', function() {
                var data = [],
                    subforms = parent.document.getElementsByTagName("form");
    
                for (x = 0 ; x < subforms.length; x++) {
                    var elements = subforms[x].elements;
                    for (e = 0; e < elements.length; e++) {
                        if (elements[e].name.length) {
                            data.push(elements[e].name + "=" + elements[e].value);
                        }
                    }
                }
                console.log(data.join('&'));
                // attachForm(data.join('&));
            }, false);
        }
    }
    window.onload = collectInputs();
    
        8
  •  0
  •   ristonj    16 年前

    您可以使用document.getElementById并返回元素[]数组来获取表单。

    Here is an example.

    您还可以使用document.getElementById函数获取表单的每个字段并获取其值,然后传入字段的id。

        9
  •  0
  •   Ren Daniel Harper    12 年前

    我认为以下代码将只处理表单中的文本字段:

    var str = $('#formId').serialize();
    

    要添加其他类型的输入类型,我们可以使用:

    $("input[type='checkbox'], input[type='radio']").on( "click", functionToSerialize );
    $("select").on( "change", functionToSerialize );
    
        10
  •  -1
  •   regex    16 年前

    根据您在表单上使用的输入类型,您应该能够使用标准jQuery表达式获取它们。

    例子:

    // change forms[0] to the form you're trying to collect elements from...  or remove it, if you need all of them
    var input_elements = $("input, textarea", document.forms[0]);
    

    有关更多信息,请查看其网站上jQuery表达式的文档: http://docs.jquery.com/Core/jQuery#expressioncontext