Skip to content

Commit 930d7d8

Browse files
committed
Merge pull request BaiduFE#269 from aJean/dev
添加baidu.form以及两个方法
2 parents 2fca520 + d25663f commit 930d7d8

File tree

5 files changed

+394
-0
lines changed

5 files changed

+394
-0
lines changed

src/baidu/form.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* Tangram
3+
* Copyright 2009 Baidu Inc. All rights reserved.
4+
*
5+
* path: baidu/fn.js
6+
* author: qiaoyue
7+
* version: 1.0.0
8+
* date: 2011/12/23
9+
*/
10+
11+
///import baidu;
12+
/**
13+
* 对form的操作,解决表单数据问题
14+
* @namespace baidu.form
15+
*/
16+
baidu.form = baidu.form || {};

src/baidu/form/json.js

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/*
2+
* Tangram
3+
* Copyright 2009 Baidu Inc. All rights reserved.
4+
*
5+
* path: baidu/form/json.js
6+
* author: qiaoyue
7+
* version: 1.1.0
8+
* date: 2011/12/23
9+
*/
10+
11+
///import baidu.form;
12+
///import baidu.url.escapeSymbol;
13+
14+
/**
15+
* josn化表单数据
16+
* @name baidu.form.json
17+
* @function
18+
* @grammar baidu.form.json(form[, replacer])
19+
* @param {HTMLFormElement} form 需要提交的表单元素
20+
* @param {Function} replacer 对参数值特殊处理的函数,replacer(string value, string key)
21+
22+
* @returns {data} 表单数据js对象
23+
*/
24+
baidu.form.json = function (form, replacer) {
25+
var elements = form.elements,
26+
replacer = replacer || function (value, name) {
27+
return value;
28+
},
29+
data = {},
30+
item, itemType, itemName, itemValue,
31+
opts, oi, oLen, oItem;
32+
33+
/**
34+
* 向缓冲区添加参数数据
35+
* @private
36+
*/
37+
function addData(name, value) {
38+
var val = data[name];
39+
if(val){
40+
val.push || ( data[name] = [val] );
41+
data[name].push(value);
42+
}else{
43+
data[name] = value;
44+
}
45+
}
46+
47+
for (var i = 0, len = elements.length; i < len; i++) {
48+
item = elements[i];
49+
itemName = item.name;
50+
51+
// 处理:可用并包含表单name的表单项
52+
if (!item.disabled && itemName) {
53+
itemType = item.type;
54+
itemValue = baidu.url.escapeSymbol(item.value);
55+
56+
switch (itemType) {
57+
// radio和checkbox被选中时,拼装queryString数据
58+
case 'radio':
59+
case 'checkbox':
60+
if (!item.checked) {
61+
break;
62+
}
63+
64+
// 默认类型,拼装queryString数据
65+
case 'textarea':
66+
case 'text':
67+
case 'password':
68+
case 'hidden':
69+
case 'file':
70+
case 'select-one':
71+
addData(itemName, replacer(itemValue, itemName));
72+
break;
73+
74+
// 多行选中select,拼装所有选中的数据
75+
case 'select-multiple':
76+
opts = item.options;
77+
oLen = opts.length;
78+
for (oi = 0; oi < oLen; oi++) {
79+
oItem = opts[oi];
80+
if (oItem.selected) {
81+
addData(itemName, replacer(oItem.value, itemName));
82+
}
83+
}
84+
break;
85+
}
86+
}
87+
}
88+
89+
return data;
90+
};

src/baidu/form/serialize.js

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/*
2+
* Tangram
3+
* Copyright 2009 Baidu Inc. All rights reserved.
4+
*
5+
* path: baidu/form/serialize.js
6+
* author: qiaoyue
7+
* version: 1.1.0
8+
* date: 2011/12/23
9+
*/
10+
11+
///import baidu.form;
12+
///import baidu.url.escapeSymbol;
13+
14+
/**
15+
* 序列化表单数据
16+
* @name baidu.form.serialize
17+
* @function
18+
* @grammar baidu.form.serialize(form[, replacer])
19+
* @param {HTMLFormElement} form 需要提交的表单元素
20+
* @param {Function} replacer 对参数值特殊处理的函数,replacer(string value, string key)
21+
22+
* @returns {data} 表单数据数组
23+
*/
24+
baidu.form.serialize = function (form, replacer) {
25+
var elements = form.elements,
26+
replacer = replacer || function (value, name) {
27+
return value;
28+
},
29+
data = [],
30+
item, itemType, itemName, itemValue,
31+
opts, oi, oLen, oItem;
32+
33+
/**
34+
* 向缓冲区添加参数数据
35+
* @private
36+
*/
37+
function addData(name, value) {
38+
data.push(name + '=' + value);
39+
}
40+
41+
for (var i = 0, len = elements.length; i < len; i++) {
42+
item = elements[i];
43+
itemName = item.name;
44+
45+
// 处理:可用并包含表单name的表单项
46+
if (!item.disabled && itemName) {
47+
itemType = item.type;
48+
itemValue = baidu.url.escapeSymbol(item.value);
49+
50+
switch (itemType) {
51+
// radio和checkbox被选中时,拼装queryString数据
52+
case 'radio':
53+
case 'checkbox':
54+
if (!item.checked) {
55+
break;
56+
}
57+
58+
// 默认类型,拼装queryString数据
59+
case 'textarea':
60+
case 'text':
61+
case 'password':
62+
case 'hidden':
63+
case 'file':
64+
case 'select-one':
65+
addData(itemName, replacer(itemValue, itemName));
66+
break;
67+
68+
// 多行选中select,拼装所有选中的数据
69+
case 'select-multiple':
70+
opts = item.options;
71+
oLen = opts.length;
72+
for (oi = 0; oi < oLen; oi++) {
73+
oItem = opts[oi];
74+
if (oItem.selected) {
75+
addData(itemName, replacer(oItem.value, itemName));
76+
}
77+
}
78+
break;
79+
}
80+
}
81+
}
82+
83+
return data;
84+
};

test/baidu/form/json.js

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
module('baidu.form.json');
2+
function createForm() {
3+
var div, form, text1, text2, hid, cb1, cb2, rb1, rb2, pass, textArea, sel, selmul, button;
4+
div = document.createElement('div');
5+
div.id = 'test_div';
6+
form = document.createElement('form');
7+
form.id = 'test_form';
8+
9+
text1 = document.createElement('input');
10+
text2 = document.createElement('input');
11+
hid = document.createElement('input');
12+
rb1 = document.createElement('input');
13+
rb2 = document.createElement('input');
14+
cb1 = document.createElement('input');
15+
cb2 = document.createElement('input');
16+
pass = document.createElement('input');
17+
textArea = document.createElement('textarea');
18+
sel = document.createElement('select');
19+
selmul = document.createElement('select');
20+
button = document.createElement('button');
21+
22+
div.appendChild(form);
23+
document.body.appendChild(div);
24+
25+
text1.type = "text";
26+
text1.disabled = "disabled";
27+
text1.value = "disable";
28+
29+
text2.type = "text";
30+
text2.value = "param&1";
31+
text2.name = "param1";
32+
33+
hid.type = "hidden";
34+
hid.name = "param2";
35+
hid.value = "param2";
36+
37+
form.appendChild(text1);
38+
form.appendChild(text2);
39+
form.appendChild(hid);
40+
41+
rb1.type = "radio";
42+
rb1.value = "rb1";
43+
rb1.name = "rb";
44+
rb2.type = "radio";
45+
rb2.value = "rb2";
46+
rb2.name = "rb";
47+
cb1.name = "cb";
48+
cb1.type = "checkbox";
49+
cb1.value = "cb1";
50+
cb2.name = "cb";
51+
cb2.type = "checkbox";
52+
cb2.value = "cb2";
53+
54+
form.appendChild(cb1);
55+
form.appendChild(cb2);
56+
form.appendChild(rb1);
57+
form.appendChild(rb2);
58+
59+
rb2.checked = true;
60+
cb1.checked = true;
61+
62+
pass.type = "password";
63+
pass.value = "pwd";
64+
pass.name = "pwd";
65+
66+
textArea.name = "ta";
67+
textArea.value = "textarea";
68+
69+
sel.name = "sel";
70+
sel.options[sel.options.length] = new Option('1', '1');
71+
sel.options[sel.options.length] = new Option('2', '2');
72+
sel.options[sel.options.length] = new Option('3', '3');
73+
sel.options[2].selected = "selected";
74+
75+
selmul.name = "selmul";
76+
selmul.multiple = "multiple";
77+
if(selmul.type != 'select-multiple'){
78+
selmul = document.createElement('<select name="selmul" multiple="true"></select>');
79+
}
80+
selmul.options[selmul.options.length] = new Option('1', '1');
81+
selmul.options[selmul.options.length] = new Option('2', '2');
82+
selmul.options[selmul.options.length] = new Option('3', '3');
83+
selmul.options[selmul.options.length] = new Option('4', '4');
84+
selmul.options[0].selected = "selected";
85+
selmul.options[1].selected = "selected";
86+
selmul.options[2].selected = "selected";
87+
88+
button.id = "sub";
89+
button.value = "提交";
90+
91+
form.appendChild(pass);
92+
form.appendChild(textArea);
93+
form.appendChild(sel);
94+
form.appendChild(selmul);
95+
form.appendChild(button);
96+
return form;
97+
}
98+
99+
test("传入form,返回结果", function() {
100+
var f = createForm();
101+
baidu.form.json(f);
102+
});

0 commit comments

Comments
 (0)