原生JavaScript實現(xiàn)批量獲取表單數(shù)據(jù)
背景
昨天表弟問了我一個問題
我立馬會回了一段代碼過去。豈能說不會!
分析
其實要快速獲取表單數(shù)據(jù)的功能并不復雜。就兩步
- 分析需求
- 編寫代碼
- 要清楚常見的表單有哪些
- 根據(jù)表單獲取到的數(shù)據(jù)結(jié)構是什么樣子
常見的表單標簽
email、date等存在兼容性的表單標簽可以忽略。
文本框 input[type=text]
<input type="text">
密碼框 input[type=password]
<input type="password">
文本域 textarea
<textarea></textarea>
下拉列表 select
<select></select>
單選框 input[type=radio]
<input type="radio">
復選框 input[type=checkbox]
<input type="checkbox">
文件選擇框 input[type=file]
<input type="file">
獲取表單值的方式
不同的標簽,有不同的獲取它們值的方式
文本框和密碼框和文本域
他們都是通過 value屬性直接獲取值
dom.value
下拉列表
下拉列表其實也可以多選的 multiple
<select name="city" multiple> <option value="廣州">廣州</option> <option value="東莞">東莞</option> <option value="佛山">佛山</option> </select>
當下拉列表 沒有添加多選時,直接 通過value屬性即可獲取到對應值。dom.value
當下拉列表 添加多選時 ,獲取獲取子元素 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); } }
單選框
單選框的特點是 同一組單選框都會有同一個name屬性。并且選中的單選框的checked屬性為true
<input type="radio" name="gender" value="男" checked> 男 <input type="radio" name="gender" value="女"> 女
因此便可以通過這個特點來獲取選中的單選框。獲取的方式有兩種
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 } }
復選框
復選框的用法和單選框類似,只不過復選框是可以擁有多個值
<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來獲取即可,當然,它也可以通過添加 multiple
屬性來實現(xiàn)多選
<input type="file" name="avatar" multiple>
dom.files // 獲取到選中的文件
期望得到的數(shù)據(jù)結(jié)構
當我們了解了常見的表單標簽后,那么我們要假設期待得到的數(shù)據(jù)結(jié)構
提煉關鍵信息:
當表單是 文本框、密碼框、文本域 、單選框時,我們都可以直接通過 value屬性
來獲取數(shù)據(jù),并且存放時,他們是字符串類型
{ 文本框:"用戶名", 密碼框:"密碼", 性別:"男" }
當表單是下拉列表時,存放它的值需要分情況
單選的下拉列表 (沒有 multiple
屬性),是字符串類型
{ 城市:"廣州" }
多選的下拉列表 (有 multiple
屬性),是數(shù)組類型
{ 城市:["廣州","東莞"] }
當表單是 多選框時,存放它的數(shù)據(jù)時,是數(shù)組類型
{ 喜好:["唱","跳","rap"] }
當表單是 文件選擇框時,存放它的數(shù)據(jù),是數(shù)組(因為可能多選文件)
{ 照片:[照片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> <!-- 選擇興趣愛好的復選框 --> <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> <!-- 輸入個人簡介的文本域 --> <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) { // 阻止默認的表單提交行為 e.preventDefault() // 序列化表單數(shù)據(jù),并存儲在常量data中 const data = serialize(form) console.log(data) }) // 定義序列化函數(shù),接收一個表單元素作為參數(shù) function serialize(tempForm) { // 創(chuàng)建一個空對象,用于存儲序列化后的表單數(shù)據(jù) const data = {} // 獲取表單中所有具有"name"屬性的字段 const formFieldList = tempForm.querySelectorAll('[name]') // 遍歷所有表單字段 formFieldList.forEach((field) => { // 檢查字段的類型和標簽名 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將選中的項的值存儲在數(shù)組中 data[field.name] = [...field.children].reduce((a, b) => { if (b.selected) { a.push(b.value) } return a }, []) } else { // 如果是單選下拉框,直接將選中的項的值存儲在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) { // 如果是復選框且被選中 if (!data[field.name]) { // 如果該字段在data對象中不存在,創(chuàng)建一個數(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實現(xiàn)批量獲取表單數(shù)據(jù)的詳細內(nèi)容,更多關于JavaScript獲取表單數(shù)據(jù)的資料請關注腳本之家其它相關文章!
相關文章
uniapp使用scroll-view實現(xiàn)左右上下滑動功能
最近在用uni-app開發(fā)小程序時,需要用scroll-view做出左右上下滑動效果,所以下面這篇文章主要給大家介紹了關于uniapp使用scroll-view實現(xiàn)左右上下滑動功能的相關資料,需要的朋友可以參考下2022-11-11微信小程序?qū)崿F(xiàn)點擊按鈕修改view標簽背景顏色功能示例【附demo源碼下載】
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)點擊按鈕修改view標簽背景顏色功能,涉及微信小程序事件響應及數(shù)值運算實現(xiàn)動態(tài)設置view背景色樣式的相關操作技巧,需要的朋友可以參考下2017-12-12微信小程序開發(fā)之a(chǎn)nimation循環(huán)動畫實現(xiàn)的讓云朵飄效果
這篇文章主要介紹了微信小程序開發(fā)之a(chǎn)nimation循環(huán)動畫實現(xiàn)的讓云朵飄效果,結(jié)合實例形式分析了animation結(jié)合js時間函數(shù)實現(xiàn)循環(huán)動畫效果的具體步驟與相關操作技巧,需要的朋友可以參考下2017-07-07[js高手之路]單例模式實現(xiàn)模態(tài)框的示例
下面小編就為大家?guī)硪黄猍js高手之路]單例模式實現(xiàn)模態(tài)框的示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09