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 });