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裁剪圖片并存儲(chǔ)的簡(jiǎn)單實(shí)現(xiàn)
裁剪圖片對(duì)我們來(lái)說(shuō)是再熟悉不過(guò)的了,最近工作中就又遇到了這個(gè)需求,所以想著干脆整理下來(lái),方法大家和自己在需要的時(shí)候參考學(xué)習(xí),所以這篇文章主要介紹了利用Javascript裁剪圖片并存儲(chǔ)的簡(jiǎn)單實(shí)現(xiàn),后端PHP處理我用的是THINKPHP框架,需要的朋友可以參考下。2017-03-03layui問(wèn)題之自動(dòng)滾動(dòng)二級(jí)iframe頁(yè)面到指定位置的方法
今天小編就為大家分享一篇layui問(wèn)題之自動(dòng)滾動(dòng)二級(jí)iframe頁(yè)面到指定位置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09js漢字排序問(wèn)題 支持中英文混排,兼容各瀏覽器,包括CHROME
這套排序機(jī)制同時(shí)兼容了IE和ff 可以實(shí)現(xiàn)所有瀏覽器下排序的統(tǒng)一哦2011-12-12JavaScript 變量,數(shù)據(jù)類型基礎(chǔ)實(shí)例詳解【變量、字符串、數(shù)組、對(duì)象等】
這篇文章主要介紹了JavaScript 變量,數(shù)據(jù)類型基礎(chǔ),結(jié)合實(shí)例形式詳細(xì)分析了JavaScript變量聲明、字符串、數(shù)組、對(duì)象等基本使用方法與操作注意事項(xiàng),需要的朋友可以參考下2020-01-01一篇文章帶你吃透JavaScript中的DOM知識(shí)及用法
DOM作用:用來(lái)修改網(wǎng)頁(yè)內(nèi)容,結(jié)構(gòu)和樣式,下面這篇文章主要給大家介紹了關(guān)于如何通過(guò)一篇文章帶你吃透JavaScript中的DOM知識(shí)及用法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11基于javascript實(shí)現(xiàn)句子翻牌網(wǎng)頁(yè)版小游戲
這篇文章主要介紹了基于javascript實(shí)現(xiàn)句子翻牌網(wǎng)頁(yè)版小游戲的相關(guān)資料,需要的朋友可以參考下2016-03-03微信小程序開(kāi)發(fā)之組件設(shè)計(jì)規(guī)范
這篇文章主要給大家介紹了關(guān)于微信小程序開(kāi)發(fā)之組件設(shè)計(jì)規(guī)范的相關(guān)資料,對(duì)剛?cè)腴T(mén)學(xué)習(xí)微信小程序的同學(xué)們還是挺有幫助的,需要的朋友可以參考下2021-05-05