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)