let l = console.log;functionqs(s){return document.querySelector(s)}let toArray = Array.from;let f =qs('.form')let body ={}scanDOM(f);functionscanDOM(box){let eles =toArray(box.children)for(let ele of eles){if(ele.children.length && ele.nodeName !=='SELECT'&& ele.nodeName !=='FIELDSET'){// select元素没有必要递归,表单包也暂时不用遍历scanDOM(ele)}else{let nodeName = ele.nodeName.toLowerCase();letformElementp=(v)=> v ==='input'|| v ==='select'|| v ==='textarea'|| v ==='fieldset';if(formElementp(nodeName)){// 确认元素是表单元素if(ele.disabled ===true)continue;// 如果元素为禁用则跳过let k, v;
k = ele.name;if(!k)continue;// 没有name的表单元素跳过if(ele.type ==='radio'){// 单选按钮时,需要判断是否为选中状态if(!ele.checked)continue;
v = ele.value;}elseif(ele.type ==='checkbox'){if(!ele.checked)continue;
v = ele.value;}else{if(nodeName ==='select'&& ele.multiple){let vs =[];// 收集所有多选状态下的 selected的value,let options =toArray(ele.children);for(let o of options){
vs.push(o.value)}
v = vs;}elseif(nodeName ==='fieldset'){scanDOM(ele)}else{
v = ele.value;}}if(v === undefined)continue;let alive = k in body;if(alive){// 已经存在相应的namelet ov = body[k]if(Object.prototype.toString.call(body[k])==='[object Array]'){
body[k]= ov.concat(v)}else{
body[k]=[ov, v]}}else{
body[k]= v;}}}}}l(body)