利用JS輕松實(shí)現(xiàn)獲取表單數(shù)據(jù)
接觸過Angularjs的都知道,ng支持雙向綁定,我們可以輕輕松松的通過ngModel將我們的值綁定到界面,當(dāng)修改了值提交表單的時(shí)候不需要再重新通過ID去重新抓取輸入框信息了。那對(duì)于我們開發(fā)前臺(tái)網(wǎng)站,不用ng一類的MVVM框架,只引用了Jquery,那么在處理表單的時(shí)候該怎么做呢。
一. 原始做法
<div id="form"> <select id='select1'> <option value="">--請(qǐng)選擇--</option> <option value="1">--1--</option> <option value="2">--2--</option> <option value="3">--3--</option> </select> <input id='radio1' type="radio" /> <input id='text1' type="text" /> <textarea id='textArea1' ></textarea> </div>
程序員A會(huì)說,So easy,通過Jquery id 去獲取每個(gè)輸入框的值就OK。多簡(jiǎn)單。
function getEntity(){
return {
select1:$("#select1").val(),
radio1:$("#radio1").prop('checked'),
text1:$("text1").val(),
textArea1:$("textArea1").val()
}
}
二. 升級(jí)做法.
程序員B說, 這樣不行哦,很多頁(yè)面都有表單提交, 那不是每個(gè)地方都要用Jquery去獲取值,如果以后新增了輸入框,每次HTML修改了,還要修改對(duì)應(yīng)的JS,多麻煩。于是愛偷懶的程序員B想到了一種方法,通過自定義標(biāo)簽來(lái)實(shí)現(xiàn)。
2.1 我們將表單包裝到一個(gè)form的div下,每個(gè)輸入的控件新增一個(gè)data-field屬性. data-field里面寫構(gòu)建實(shí)體的屬性名稱,考慮到會(huì)出現(xiàn)嵌套的對(duì)象。所以data-field 里面屬性名稱通過 . 點(diǎn)來(lái)隔開,譬如 data-field='Person.Name' 后面就會(huì)構(gòu)建出 { Person:{ Name:xxx }} .下面的是沒有嵌套的對(duì)象的例子
<div id="form">
<select data-field='select1'>
<option value="">--請(qǐng)選擇--</option>
<option value="1">--1--</option>
<option value="2">--2--</option>
<option value="3">--3--</option>
</select>
<input data-field='radio1' type="radio" />
<input data-field='text1' type="text" />
<textarea data-field='textArea1'></textarea>
</div>
2.2 提供一個(gè)getEntity方法。 讀取外層的Form然后找到所有的data-field 屬性去遍歷. 因?yàn)檩斎肟蛴衏heckbox和radio,input和select, 所以判斷類型先取出值。然后調(diào)用getField方法構(gòu)建實(shí)體。代碼就不做詳細(xì)解答了。應(yīng)該都能看懂。只是想表達(dá)一下思路想法而已。
function getEntity(form) {
var result = {};
$(form).find("[data-field]").each(function() {
var field = $(this).attr("data-field");
var val;
if ($(this).attr('type') == 'checkbox') {
val = $(this).prop('checked');
} else if ($(this).attr('type') == 'radio') {
val = $(this).prop('checked');
} else {
val = $(this).val();
}
// 獲取單個(gè)屬性的值,并擴(kuò)展到result對(duì)象里面
getField(field.split('.'), val, result);
});
return result;
}
function getField(fieldNames, value, result) {
if (fieldNames.length > 1) {
for (var i = 0; i < fieldNames.length - 1; i++) {
if (result[fieldNames[i]] == undefined) {
result[fieldNames[i]] = {}
}
result = result[fieldNames[i]];
}
result[fieldNames[fieldNames.length - 1]] = value;
} else {
result[fieldNames[0]] = value;
}
}
2.3 下面來(lái)看看上面輸出的結(jié)果,哈哈值取到了。

2.4 下面我們來(lái)看看看嵌套的對(duì)象
<div id="form">
<select data-field='Person.Job'>
<option value="">--職位--</option>
<option value="java工程師">java工程師</option>
<option value="net工程師">.net工程師</option>
<option value="python工程師">python工程師</option>
</select>
<input data-field='Person.Desc' type="text" />
</div>

2.5 提供了獲取實(shí)體的方法,當(dāng)然也要提供賦值的方法呀。下面來(lái)看看賦值的方法
function setEntity(form, entity) {
$(form).find("[data-field]").each(function() {
var field = $(this).attr("data-field");
fieldNames = field.split('.');
var value = JSON.parse(JSON.stringify(entity));
for (var index = 0; index < fieldNames.length; index++) {
value = value[fieldNames[index]];
if (!value) {
break;
}
}
if ($(this).attr("type") === "checkbox" ||
$(this).attr("type") === "radio") {
$(this).attr('checked', Boolean(value));
} else {
if (value) {
$(this).val(value);
} else {
$(this).val("");
}
}
})
}

呵呵,值附上去了.
三. 總結(jié):
上面只是提供了解決方案, 雖然前臺(tái)系統(tǒng),不會(huì)考慮像后臺(tái)backend 系統(tǒng)那樣,用react,angularjs這種MVVM框架, 雖然只是用了一個(gè)Jquery而已。不過我們還是可以通過一些方法來(lái)簡(jiǎn)化項(xiàng)目代碼的。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問大家可以留言交流,同時(shí)也希望多多支持腳本之家!
- ASP之處理用Javascript動(dòng)態(tài)添加的表單元素?cái)?shù)據(jù)的代碼
- 原生js實(shí)現(xiàn)獲取form表單數(shù)據(jù)代碼實(shí)例
- Vue.js實(shí)現(xiàn)雙向數(shù)據(jù)綁定方法(表單自動(dòng)賦值、表單自動(dòng)取值)
- form表單數(shù)據(jù)封裝成json格式并提交給服務(wù)器的實(shí)現(xiàn)方法
- JS獲取一個(gè)表單字段中多條數(shù)據(jù)并轉(zhuǎn)化為json格式
- 基于JavaScript實(shí)現(xiàn)帶數(shù)據(jù)驗(yàn)證和復(fù)選框的表單提交
- Vue.js基礎(chǔ)指令實(shí)例講解(各種數(shù)據(jù)綁定、表單渲染大總結(jié))
- JavaScript動(dòng)態(tài)添加數(shù)據(jù)到表單并提交的幾種方式
相關(guān)文章
微信實(shí)現(xiàn)自動(dòng)跳轉(zhuǎn)到用其他瀏覽器打開指定APP下載
這篇文章主要介紹了微信實(shí)現(xiàn)自動(dòng)跳轉(zhuǎn)到用其他瀏覽器打開指定APP下載,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2019-02-02
JS實(shí)現(xiàn)鼠標(biāo)框選效果完整實(shí)例
這篇文章主要介紹了JS實(shí)現(xiàn)鼠標(biāo)框選效果,可實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊出現(xiàn)框選效果的功能,同時(shí)下方實(shí)時(shí)顯示框選大小,涉及javascript鼠標(biāo)事件的響應(yīng)與頁(yè)面元素的動(dòng)態(tài)運(yùn)算技巧,需要的朋友可以參考下2016-06-06
簡(jiǎn)單的網(wǎng)頁(yè)廣告特效實(shí)例
下面小編就為大家?guī)?lái)一篇簡(jiǎn)單的網(wǎng)頁(yè)廣告特效實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-08-08
JavaScript+html實(shí)現(xiàn)前端頁(yè)面滑動(dòng)驗(yàn)證(2)
這篇文章主要為大家詳細(xì)介紹了JavaScript+html實(shí)現(xiàn)前端頁(yè)面滑動(dòng)驗(yàn)證的第二種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06

