原生JavaScript實(shí)現(xiàn)批量獲取表單數(shù)據(jù)
背景
昨天表弟問了我一個(gè)問題

我立馬會回了一段代碼過去。豈能說不會!

分析
其實(shí)要快速獲取表單數(shù)據(jù)的功能并不復(fù)雜。就兩步
- 分析需求
- 編寫代碼
- 要清楚常見的表單有哪些
- 根據(jù)表單獲取到的數(shù)據(jù)結(jié)構(gòu)是什么樣子
常見的表單標(biāo)簽
email、date等存在兼容性的表單標(biāo)簽可以忽略。
文本框 input[type=text]
<input type="text">

密碼框 input[type=password]
<input type="password">

文本域 textarea
<textarea></textarea>

下拉列表 select
<select></select>

單選框 input[type=radio]
<input type="radio">

復(fù)選框 input[type=checkbox]
<input type="checkbox">

文件選擇框 input[type=file]
<input type="file">

獲取表單值的方式
不同的標(biāo)簽,有不同的獲取它們值的方式
文本框和密碼框和文本域
他們都是通過 value屬性直接獲取值
dom.value
下拉列表
下拉列表其實(shí)也可以多選的 multiple
<select name="city" multiple>
<option value="廣州">廣州</option>
<option value="東莞">東莞</option>
<option value="佛山">佛山</option>
</select>

當(dāng)下拉列表 沒有添加多選時(shí),直接 通過value屬性即可獲取到對應(yīng)值。dom.value
當(dāng)下拉列表 添加多選時(shí) ,獲取獲取子元素 option,通過判斷是否 selected 來獲取選中的值。
const select = document.querySelector("select")
for (let index = 0; index < select.children.length; index++) {
const option = select.children[index];
if (option.select) {
console.log(option.value);
}
}
單選框
單選框的特點(diǎn)是 同一組單選框都會有同一個(gè)name屬性。并且選中的單選框的checked屬性為true
<input type="radio" name="gender" value="男" checked> 男 <input type="radio" name="gender" value="女"> 女
因此便可以通過這個(gè)特點(diǎn)來獲取選中的單選框。獲取的方式有兩種
document.querySelector("[name=gender]:checked").value
或者
const radios = document.querySelectorAll("[name=gender]")
for (let index = 0; index < radios.children.length; index++) {
const radio = radios.children[index];
if (radio.checked) {
console.log(radio.value);
break
}
}
復(fù)選框
復(fù)選框的用法和單選框類似,只不過復(fù)選框是可以擁有多個(gè)值
<input type="checkbox" name="hobby" value="唱"> 唱 <input type="checkbox" name="hobby" value="跳"> 跳 <input type="checkbox" name="hobby" value="rap"> rap <input type="checkbox" name="hobby" value="打籃球"> 打籃球
它的獲取方式也有兩種,一種直接querySelectorAll帶上合適的選擇器即可
document.querySelectorAll("[name=hobby]:checked").value
另外一種也是遍歷
const checkboxs = document.querySelectorAll("[name=hobby]")
for (let index = 0; index < checkboxs.children.length; index++) {
const checkbox = checkboxs.children[index];
if (checkbox.checked) {
console.log(checkbox.value);
}
}
文件選擇框
最后是文件選擇框,文件選擇框需要通過 dom.files來獲取即可,當(dāng)然,它也可以通過添加 multiple 屬性來實(shí)現(xiàn)多選
<input type="file" name="avatar" multiple>
dom.files // 獲取到選中的文件
期望得到的數(shù)據(jù)結(jié)構(gòu)
當(dāng)我們了解了常見的表單標(biāo)簽后,那么我們要假設(shè)期待得到的數(shù)據(jù)結(jié)構(gòu)

提煉關(guān)鍵信息:
當(dāng)表單是 文本框、密碼框、文本域 、單選框時(shí),我們都可以直接通過 value屬性來獲取數(shù)據(jù),并且存放時(shí),他們是字符串類型
{
文本框:"用戶名",
密碼框:"密碼",
性別:"男"
}
當(dāng)表單是下拉列表時(shí),存放它的值需要分情況
單選的下拉列表 (沒有 multiple 屬性),是字符串類型
{
城市:"廣州"
}
多選的下拉列表 (有 multiple 屬性),是數(shù)組類型
{
城市:["廣州","東莞"]
}
當(dāng)表單是 多選框時(shí),存放它的數(shù)據(jù)時(shí),是數(shù)組類型
{
喜好:["唱","跳","rap"]
}
當(dāng)表單是 文件選擇框時(shí),存放它的數(shù)據(jù),是數(shù)組(因?yàn)榭赡芏噙x文件)
{
照片:[照片1,照片2]
}
編碼流程

完整代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>快速獲取表單數(shù)據(jù)</title>
</head>
<body>
<form>
<!-- 輸入姓名的文本框 -->
<div>
<input type="text" placeholder="請輸入姓名" name="userName" />
</div>
<!-- 選擇性別的單選按鈕 -->
<div>
<input type="radio" name="gender" value="男" /> 男
<input type="radio" name="gender" value="女" /> 女
</div>
<!-- 選擇是否在世的單選按鈕 -->
<div>
<input type="radio" name="alive" value="還在" checked /> 還在
<input type="radio" name="alive" value="上天了" /> 上天了
</div>
<!-- 選擇興趣愛好的復(fù)選框 -->
<div>
<input type="checkbox" name="hobby" value="唱" /> 唱
<input type="checkbox" name="hobby" value="跳" /> 跳
<input type="checkbox" name="hobby" value="rap" /> rap
<input type="checkbox" name="hobby" value="打籃球" /> 打籃球
</div>
<!-- 選擇城市的下拉框 -->
<div>
<select name="city" multiple>
<option value="廣州">廣州</option>
<option value="東莞">東莞</option>
<option value="佛山">佛山</option>
</select>
</div>
<!-- 輸入個(gè)人簡介的文本域 -->
<div>
<textarea name="intro"></textarea>
</div>
<!-- 上傳頭像的文件輸入框 -->
<div>
上傳頭像
<input type="file" name="avatar" multiple />
</div>
<!-- 提交按鈕 -->
<div>
<button>提交</button>
</div>
</form>
<script>
// 獲取表單元素并存儲在常量form中
const form = document.querySelector('form')
// 為表單添加提交事件監(jiān)聽器
form.addEventListener('submit', function (e) {
// 阻止默認(rèn)的表單提交行為
e.preventDefault()
// 序列化表單數(shù)據(jù),并存儲在常量data中
const data = serialize(form)
console.log(data)
})
// 定義序列化函數(shù),接收一個(gè)表單元素作為參數(shù)
function serialize(tempForm) {
// 創(chuàng)建一個(gè)空對象,用于存儲序列化后的表單數(shù)據(jù)
const data = {}
// 獲取表單中所有具有"name"屬性的字段
const formFieldList = tempForm.querySelectorAll('[name]')
// 遍歷所有表單字段
formFieldList.forEach((field) => {
// 檢查字段的類型和標(biāo)簽名
if (
field.type === 'text' ||
field.type === 'password' ||
field.tagName === 'TEXTAREA'
) {
// 如果是文本輸入框或文本域,則將其值存儲在data對象中
data[field.name] = field.value
} else if (field.tagName === 'SELECT') {
// 如果是下拉框
if (field.multiple) {
// 如果是多選下拉框,使用reduce將選中的項(xiàng)的值存儲在數(shù)組中
data[field.name] = [...field.children].reduce((a, b) => {
if (b.selected) {
a.push(b.value)
}
return a
}, [])
} else {
// 如果是單選下拉框,直接將選中的項(xiàng)的值存儲在data對象中
data[field.name] = field.value
}
} else if (field.type === 'radio' && field.checked) {
// 如果是單選按鈕且被選中,則將其值存儲在data對象中
data[field.name] = field.value
} else if (field.type === 'checkbox' && field.checked) {
// 如果是復(fù)選框且被選中
if (!data[field.name]) {
// 如果該字段在data對象中不存在,創(chuàng)建一個(gè)數(shù)組存儲值
data[field.name] = [field.value]
} else {
// 如果已存在,將值添加到數(shù)組中
data[field.name].push(field.value)
}
} else if (field.type === 'file') {
// 如果是文件上傳字段
// 如果支持多文件上傳,將文件對象數(shù)組存儲在data對象中
data[field.name] = field.files
}
})
// 返回包含序列化后數(shù)據(jù)的對象
return data
}
</script>
</body>
</html>以上就是原生JavaScript實(shí)現(xiàn)批量獲取表單數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于JavaScript獲取表單數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
uniapp使用scroll-view實(shí)現(xiàn)左右上下滑動(dòng)功能
最近在用uni-app開發(fā)小程序時(shí),需要用scroll-view做出左右上下滑動(dòng)效果,所以下面這篇文章主要給大家介紹了關(guān)于uniapp使用scroll-view實(shí)現(xiàn)左右上下滑動(dòng)功能的相關(guān)資料,需要的朋友可以參考下2022-11-11
微信小程序?qū)崿F(xiàn)點(diǎn)擊按鈕修改view標(biāo)簽背景顏色功能示例【附demo源碼下載】
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)點(diǎn)擊按鈕修改view標(biāo)簽背景顏色功能,涉及微信小程序事件響應(yīng)及數(shù)值運(yùn)算實(shí)現(xiàn)動(dòng)態(tài)設(shè)置view背景色樣式的相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
微信小程序開發(fā)之a(chǎn)nimation循環(huán)動(dòng)畫實(shí)現(xiàn)的讓云朵飄效果
這篇文章主要介紹了微信小程序開發(fā)之a(chǎn)nimation循環(huán)動(dòng)畫實(shí)現(xiàn)的讓云朵飄效果,結(jié)合實(shí)例形式分析了animation結(jié)合js時(shí)間函數(shù)實(shí)現(xiàn)循環(huán)動(dòng)畫效果的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
javascript實(shí)現(xiàn)電腦和手機(jī)版樣式切換
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)電腦和手機(jī)版樣式切換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
[js高手之路]單例模式實(shí)現(xiàn)模態(tài)框的示例
下面小編就為大家?guī)硪黄猍js高手之路]單例模式實(shí)現(xiàn)模態(tài)框的示例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09

