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

How*_*ley 48 html javascript forms ajax jquery

我的页面上有一个表单,并使用Javascript/JQuery动态地向表单添加控件.在某些时候,我需要将客户端表单中的所有值作为集合或查询字符串.我不想提交表单,因为我想将表单值以及我在客户端上的其他信息传递给后端WCF/Ajax服务方法.所以我试图找出如何捕获表单通常发送到服务器的同一类型集合中的所有值,如果表单实际提交的话.我怀疑有一种简单的方法可以捕获它,但我很难过.

Bry*_*yle 46

在直接的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("&");
Run Code Online (Sandbox Code Playgroud)

简而言之,这会创建一个键值对(name = value)列表,然后使用"&"作为分隔符将它们连接在一起.

  • 警告:`e.value` 总是为复选框返回 `on`!解决方法:插入 `var value = e.getAttribute("type") == "checkbox" ?e.checked : e.value` 并使用 `value` 代替 `e.value`。 (3认同)
  • 注意:"e.value始终为复选框返回!" 不,不!只需设置复选框的value属性,可以直接在html中,也可以通过js.例如:<input type ="checkbox"value ="true"> (3认同)

Chr*_*mer 43

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

var queryString = $('#myFormId').formSerialize();
Run Code Online (Sandbox Code Playgroud)

来自http://malsup.com/jquery/form

或者使用直接jquery:

var queryString = $('#myFormId').serialize();
Run Code Online (Sandbox Code Playgroud)

  • 问题是,当使用复选框时,数据根本不显示,我宁愿将其设置为 false。 (2认同)

小智 24

如果你的表格标签是这样的

<form action="" method="post" id="BookPackageForm">
Run Code Online (Sandbox Code Playgroud)

然后使用forms对象获取表单元素.

var formEl = document.forms.BookPackageForm;
Run Code Online (Sandbox Code Playgroud)

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

var formData = new FormData(formEl);
Run Code Online (Sandbox Code Playgroud)

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

var name = formData.get('name');
Run Code Online (Sandbox Code Playgroud)

  • 截至撰写本文时,https::caniuse.com/mdn-api_formdata_get 的支持率为 94.55%。所以我认为那很好。顺便问一下,谁还在为 Internet Explorer 进行开发? (20认同)
  • 请注意,formData.get() 没有完整的浏览器支持:https://caniuse.com/mdn-api_formdata_get (2认同)

How*_*ley 15

谢谢克里斯.这就是我想要的.但是,请注意该方法是serialize().还有另一种方法serializeArray()看起来非常有用,我可以使用.谢谢你指点我正确的方向.

var queryString = $('#frmAdvancedSearch').serialize();
alert(queryString);

var fieldValuePairs = $('#frmAdvancedSearch').serializeArray();
$.each(fieldValuePairs, function(index, fieldValuePair) {
    alert("Item " + index + " is [" + fieldValuePair.name + "," + fieldValuePair.value + "]");
});
Run Code Online (Sandbox Code Playgroud)


mar*_*kom 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, ...
Run Code Online (Sandbox Code Playgroud)

  • 第一行必须是 var params =''; 避免最终字符串中出现“未定义” (2认同)
  • @SpoonMeiser @muerte否。这将获取每个元素的“ value”属性,而不管“ checked”属性的状态如何。您将获得每个复选框的checkboxname = valueattribute,以及每个无线电的radioname = valueattribute。如果将它们放入数组中,则后者甚至更糟,因为每个单选元素都会覆盖前一个元素,并且剩下array ['radioname'] = lastvalue属性。 (2认同)

thd*_*oan 6

对于那些不使用 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];
        }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)
form {
  border: 1px solid #000;
}

tr {
  vertical-align: top;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

你也可以用这支笔玩它:http : //codepen.io/thdoan/pen/EyawvR

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