JS多個表單數(shù)據(jù)提交下的serialize()應(yīng)用實例分析
本文實例講述了JS多個表單數(shù)據(jù)提交下的serialize()應(yīng)用。分享給大家供大家參考,具體如下:
在實際開發(fā)場景中,難免遇到需要多個表單的數(shù)據(jù)傳遞問題。
之所以要進行多表單的數(shù)據(jù)傳遞是因為可以進行數(shù)據(jù)分組,便于數(shù)據(jù)的維護。
這個時候,出于不依賴jquery的考慮,有一個原生js函數(shù)來解決這個問題無疑是最好的。而源自于《JavaScript高級程序設(shè)計》一書的serialize()函數(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); } 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("&"); }
對于讀過《JavaScript高級程序設(shè)計》的小伙伴來說,這個函數(shù)肯定不陌生;
但是如果我們傳遞的是一個對象,那么這個函數(shù)顯然就不符合要求,而在這個開發(fā)需求下,我們改下這個函數(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ù)改為對象形式 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)建對象 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ù)改為對象顯示。如果有多個表單將表單保存到一個數(shù)組之中,利用JSON.stringify()轉(zhuǎn)為json格式,傳給后端;
注意:
利用Object.defineProperty創(chuàng)建對象,要加上 enumerable:true,否則json格式中不會出現(xiàn)對應(yīng)的對象數(shù)據(jù)。這個純粹是JSON.stringify()的要求。
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《JavaScript操作DOM技巧總結(jié)》、《JavaScript頁面元素操作技巧總結(jié)》、《JavaScript事件相關(guān)操作與技巧大全》、《JavaScript查找算法技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript錯誤與調(diào)試技巧總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
- 詳談表單格式化插件jquery.serializeJSON
- 使用validate.js實現(xiàn)表單數(shù)據(jù)提交前的驗證方法
- jquery序列化form表單使用ajax提交后處理返回的json數(shù)據(jù)
- jquery ajax 如何向jsp提交表單數(shù)據(jù)
- Javascript 詳解封裝from表單數(shù)據(jù)為json串進行ajax提交
- form表單數(shù)據(jù)封裝成json格式并提交給服務(wù)器的實現(xiàn)方法
- 基于JavaScript實現(xiàn)帶數(shù)據(jù)驗證和復(fù)選框的表單提交
- 深入分析JSON編碼格式提交表單數(shù)據(jù)
- JavaScript動態(tài)添加數(shù)據(jù)到表單并提交的幾種方式
- asp.net使用JS+form表單Post和Get方式提交數(shù)據(jù)
- 淺析JavaScriptSerializer類的序列化與反序列化
相關(guān)文章
利用Javascript裁剪圖片并存儲的簡單實現(xiàn)
裁剪圖片對我們來說是再熟悉不過的了,最近工作中就又遇到了這個需求,所以想著干脆整理下來,方法大家和自己在需要的時候參考學(xué)習(xí),所以這篇文章主要介紹了利用Javascript裁剪圖片并存儲的簡單實現(xiàn),后端PHP處理我用的是THINKPHP框架,需要的朋友可以參考下。2017-03-03layui問題之自動滾動二級iframe頁面到指定位置的方法
今天小編就為大家分享一篇layui問題之自動滾動二級iframe頁面到指定位置的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09js漢字排序問題 支持中英文混排,兼容各瀏覽器,包括CHROME
這套排序機制同時兼容了IE和ff 可以實現(xiàn)所有瀏覽器下排序的統(tǒng)一哦2011-12-12JavaScript 變量,數(shù)據(jù)類型基礎(chǔ)實例詳解【變量、字符串、數(shù)組、對象等】
這篇文章主要介紹了JavaScript 變量,數(shù)據(jù)類型基礎(chǔ),結(jié)合實例形式詳細(xì)分析了JavaScript變量聲明、字符串、數(shù)組、對象等基本使用方法與操作注意事項,需要的朋友可以參考下2020-01-01基于javascript實現(xiàn)句子翻牌網(wǎng)頁版小游戲
這篇文章主要介紹了基于javascript實現(xiàn)句子翻牌網(wǎng)頁版小游戲的相關(guān)資料,需要的朋友可以參考下2016-03-03