JS多個(gè)表單數(shù)據(jù)提交下的serialize()應(yīng)用實(shí)例分析
本文實(shí)例講述了JS多個(gè)表單數(shù)據(jù)提交下的serialize()應(yīng)用。分享給大家供大家參考,具體如下:
在實(shí)際開(kāi)發(fā)場(chǎng)景中,難免遇到需要多個(gè)表單的數(shù)據(jù)傳遞問(wèn)題。
之所以要進(jìn)行多表單的數(shù)據(jù)傳遞是因?yàn)榭梢赃M(jìn)行數(shù)據(jù)分組,便于數(shù)據(jù)的維護(hù)。
這個(gè)時(shí)候,出于不依賴jquery的考慮,有一個(gè)原生js函數(shù)來(lái)解決這個(gè)問(wèn)題無(wú)疑是最好的。而源自于《JavaScript高級(jí)程序設(shè)計(jì)》一書(shū)的serialize()函數(shù)就是解決這個(gè)問(wèn)題的最好辦法,該函數(shù)如下:
function serialize(form){
var parts = [],
field = null,
i,
len,
j,
optLen,
option,
optValue;
for (i=0, len=form.elements.length; i < len; i++){
field = form.elements[i];
switch(field.type){
case "select-one":
case "select-multiple":
if (field.name.length){
for (j=0, optLen = field.options.length; j < optLen; j++){
option = field.options[j];
if (option.selected){
optValue = "";
if (option.hasAttribute){
optValue = (option.hasAttribute("value") ? option.value : option.text);
} else {
optValue = (option.attributes["value"].specified ? option.value : option.text);
}
parts.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(optValue));
}
}
}
break;
case undefined: //fieldset
case "file": //file input
case "submit": //submit button
case "reset": //reset button
case "button": //custom button
break;
case "radio": //radio button
case "checkbox": //checkbox
if (!field.checked){
break;
}
/* falls through */
default:
//don't include form fields without names
if (field.name.length){
parts.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value));
}
}
}
console.log(parts);
return parts.join("&");
}
對(duì)于讀過(guò)《JavaScript高級(jí)程序設(shè)計(jì)》的小伙伴來(lái)說(shuō),這個(gè)函數(shù)肯定不陌生;
但是如果我們傳遞的是一個(gè)對(duì)象,那么這個(gè)函數(shù)顯然就不符合要求,而在這個(gè)開(kāi)發(fā)需求下,我們改下這個(gè)函數(shù),改造后函數(shù)如下
function serialize(form){
var parts = {},
field = null,
i,
len,
j,
optLen,
option,
optValue;
for (i=0, len=form.elements.length; i < len; i++){
field = form.elements[i];
switch(field.type){
case "select-one":
case "select-multiple":
if (field.name.length){
for (j=0, optLen = field.options.length; j < optLen; j++){
option = field.options[j];
if (option.selected){
optValue = "";
if (option.hasAttribute){
optValue = (option.hasAttribute("value") ? option.value : option.text);
} else {
optValue = (option.attributes["value"].specified ? option.value : option.text);
}
//將數(shù)據(jù)改為對(duì)象形式
Object.defineProperty(parts, encodeURIComponent(field.name), {
value:encodeURIComponent(optValue),
enumerable:true //為真表示可枚舉,只有可枚舉才能出現(xiàn)在JSON.stringify()轉(zhuǎn)換的json數(shù)據(jù)中
});
}
}
}
break;
case undefined: //fieldset
case "file": //file input
case "submit": //submit button
case "reset": //reset button
case "button": //custom button
break;
case "radio": //radio button
case "checkbox": //checkbox
if (!field.checked){
break;
}
/* falls through */
default:
//don't include form fields without names
if (field.name.length){
//構(gòu)建對(duì)象
Object.defineProperty(parts, encodeURIComponent(field.name), {
value:encodeURIComponent(field.value),
enumerable:true //為真表示可枚舉,只有可枚舉才能出現(xiàn)在JSON.stringify()轉(zhuǎn)換的json數(shù)據(jù)中
});
}
}
}
console.log(parts);
return parts;
}
于是,表單數(shù)據(jù)改為對(duì)象顯示。如果有多個(gè)表單將表單保存到一個(gè)數(shù)組之中,利用JSON.stringify()轉(zhuǎn)為json格式,傳給后端;
注意:
利用Object.defineProperty創(chuàng)建對(duì)象,要加上 enumerable:true,否則json格式中不會(huì)出現(xiàn)對(duì)應(yīng)的對(duì)象數(shù)據(jù)。這個(gè)純粹是JSON.stringify()的要求。
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《JavaScript操作DOM技巧總結(jié)》、《JavaScript頁(yè)面元素操作技巧總結(jié)》、《JavaScript事件相關(guān)操作與技巧大全》、《JavaScript查找算法技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
- 詳談表單格式化插件jquery.serializeJSON
- 使用validate.js實(shí)現(xiàn)表單數(shù)據(jù)提交前的驗(yàn)證方法
- jquery序列化form表單使用ajax提交后處理返回的json數(shù)據(jù)
- jquery ajax 如何向jsp提交表單數(shù)據(jù)
- Javascript 詳解封裝from表單數(shù)據(jù)為json串進(jìn)行ajax提交
- form表單數(shù)據(jù)封裝成json格式并提交給服務(wù)器的實(shí)現(xiàn)方法
- 基于JavaScript實(shí)現(xiàn)帶數(shù)據(jù)驗(yàn)證和復(fù)選框的表單提交
- 深入分析JSON編碼格式提交表單數(shù)據(jù)
- JavaScript動(dòng)態(tài)添加數(shù)據(jù)到表單并提交的幾種方式
- asp.net使用JS+form表單Post和Get方式提交數(shù)據(jù)
- 淺析JavaScriptSerializer類的序列化與反序列化
相關(guān)文章
JavaScript實(shí)現(xiàn)網(wǎng)頁(yè)版的五子棋游戲
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)網(wǎng)頁(yè)版的五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
一文詳解JavaScript中的事件循環(huán)(event?loop)機(jī)制
JavaScript中的事件循環(huán)(Event?Loop)是一種重要的機(jī)制,用于管理異步代碼的執(zhí)行,它確保?JavaScript?單線程環(huán)境中的任務(wù)按照正確的順序執(zhí)行,同時(shí)允許異步操作如定時(shí)器、網(wǎng)絡(luò)請(qǐng)求和事件處理,本將給大家詳細(xì)的介紹一下JavaScript事件循環(huán)機(jī)制,感興趣的朋友可以參考下2023-12-12
微信小程序?qū)崿F(xiàn)同一頁(yè)面取值的方法分析
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)同一頁(yè)面取值的方法,結(jié)合實(shí)例形式分析了微信小程序在同一頁(yè)面取值的常見(jiàn)情況與具體操作技巧,需要的朋友可以參考下2019-04-04
學(xué)習(xí)javascript面向?qū)ο?理解javascript對(duì)象
這篇文章主要介紹了javascript對(duì)象,學(xué)習(xí)javascript面向?qū)ο螅信d趣的小伙伴們可以參考一下2016-01-01
JavaScript實(shí)現(xiàn)動(dòng)態(tài)生成表格案例詳解
本文主要介紹了通過(guò)JavaScript實(shí)現(xiàn)一個(gè)動(dòng)態(tài)添加表格的案例,當(dāng)點(diǎn)擊添加按鈕時(shí),可以彈出一個(gè)表單,然后將輸入的內(nèi)容添加到表格中,也可以將表格中的整行內(nèi)容清除。感興趣的可以學(xué)習(xí)一下2021-12-12

