1 /** 2 * @fileOverview form data serialization util 3 * @author yiminghe@gmail.com 4 */ 5 KISSY.add("ajax/FormSerializer", function(S, DOM) { 6 var rselectTextarea = /^(?:select|textarea)/i, 7 rCRLF = /\r?\n/g, 8 rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i; 9 return { 10 /** 11 * 序列化表单元素 12 * @param {String|HTMLElement[]|HTMLElement|NodeList} forms 13 */ 14 serialize:function(forms) { 15 var elements = [],data = {}; 16 S.each(DOM.query(forms),function(el) { 17 // form 取其表单元素集合 18 // 其他直接取自身 19 var subs = el.elements ? S.makeArray(el.elements) : [el]; 20 elements.push.apply(elements, subs); 21 }); 22 // 对表单元素进行过滤,具备有效值的才保留 23 elements = S.filter(elements, function(el) { 24 // 有名字 25 return el.name && 26 // 不被禁用 27 !el.disabled && 28 ( 29 // radio,checkbox 被选择了 30 el.checked || 31 // select 或者 textarea 32 rselectTextarea.test(el.nodeName) || 33 // input 类型 34 rinput.test(el.type) 35 ); 36 37 // 这样子才取值 38 }); 39 S.each(elements, function(el) { 40 var val = DOM.val(el),vs; 41 // 字符串换行平台归一化 42 val = S.map(S.makeArray(val), function(v) { 43 return v.replace(rCRLF, "\r\n"); 44 }); 45 // 全部搞成数组,防止同名 46 vs = data[el.name] = data[el.name] || []; 47 vs.push.apply(vs, val); 48 }); 49 // 名值键值对序列化,数组元素名字前不加 [] 50 return S.param(data, undefined, undefined, false); 51 } 52 }; 53 }, { 54 requires:['dom'] 55 });