我正在尝试从表单中提取所有数据并将其转换为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('&');
上面的代码正在创建带有键和值的对象数组。能够使用上面注释过的一根衬纸会很好。
答案 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>