将表单转换为查询字符串,Vanilla JavaScript

时间:2019-07-17 11:50:16

标签: javascript

我正在尝试从表单中提取所有数据并将其转换为queryString,然后发布到端点。

到目前为止,这是我所能获得的,但是我无法找出一种快速,干净的方法将其转换为例如key=value&key=value

let data = Array.from(this.querySelectorAll('input:not([type="submit"]), select, textarea')).map(input => {
    let value = '';
    switch(input.tagName) {
        case 'INPUT':
            value = input.value;
            break;
        case 'SELECT':
            value = input[input.selectedIndex].value;
            break;
        case 'TEXTAREA':
            value = input.innerHTML;
            break;
    }

    return {
        key: input.name,
        value: value
    };
});

console.log(data);

// Object.keys(obj).map(k => `${encodeURIComponent(k)}=${encodeURIComponent(obj[k])}`).join('&');

上面的代码正在创建带有键和值的对象数组。能够使用上面注释过的一根衬纸会很好。

2 个答案:

答案 0 :(得分:2)

报废你得到的。您应该将输入内容包装在<form>中。这不仅在语义上是正确的,而且还允许您从表单中获取FormData对象。查看我的代码:

const form = document.getElementById('my-form');

form.addEventListener('submit', (evt) => {
  evt.preventDefault();
  const formData = new FormData(form);
  const params = new URLSearchParams(formData);
  console.log(params.toString());
});
<form id="my-form">
  <input type="text" name="name" id="name">
  <select id="gender" name="gender">
    <option value="foo">Foo</option>
    <option value="bar">Bar</option>
    <option value="baz">Baz</option>
  </select>
  <input type="submit" />
</form>

还可以将

FormData对象直接赋予fetch请求的主体。无需自己构造查询字符串。

您可以在上面的代码中添加或删除不同的输入字段,它仍然可以使用。

答案 1 :(得分:0)

您可以使用URLSearchParams界面将FormData界面转换为查询字符串

请尝试以下示例

const form = document.forms.form;

form.addEventListener("submit", handleSubmit);

function handleSubmit(event) {
  event.preventDefault();

  const formData = new FormData(form);
  const queryString = new URLSearchParams(formData).toString();

  console.log(queryString);
}
<form action="" name="form" id="form">
  <label for="firstName">
    First name
    <input type="text" name="firstName" id="firstName" />
  </label>

  <label for="lastName">
    Last name
    <input type="text" name="lastName" id="lastName" />
  </label>

  <label for="email">
    Email
    <input type="text" name="email" id="email" />
  </label>

  <label for="genre">
    Genre
    <select name="genre" id="genre">
      <option value="female">Female</option>
      <option value="male">Male</option>
    </select>
  </label>

  <label for="bio">
    Bio
    <textarea name="bio" id="bio" cols="30" rows="10"></textarea>
  </label>

  <p>
    <button type="submit">Submit</button>
  </p>
</form>