getQuery () を思考中。¥u〜 をどうあつかってよいものかわからず。
array::map は、本来ならコールバックで配列を渡し、操作する(配列を受け取る)のだろうけれど、あたかもグローバル変数のようにして result を弄った。
副産物の getObjectTree () が、他でも使えそうだ。
追記。map じゃなくて forEach だろ。>俺
<!DOCTYPE html> <title></title> <style type="text/css"> #PARENT-FORM { width :820px; } #LEFT-FORM { float : left; width : 400px; } #RRIGHT-FORMRTXAR, #RTXAR { width : 400px; } </style> <h3>これはテスト用です</h3> <div id="PARENT-FORM"> <form action="#" id="LEFT-FORM" method="get"> <fieldset> <legend>テキストボックス</legend> 1.<input type="text" name="text1" value="テキスト1"> 2.<input type="text" name="text1" value="テキスト2"> </fieldset> <fieldset> <legend>チェックボックス</legend> <p> 1-1.<input type="checkbox" name="chk1" value="チェック1−1" checked> 1-2.<input type="checkbox" name="chk1" value="チェック1−2" checked> <p> 2-1.<input type="checkbox" name="chk2" value="チェック2−1"> 2-2.<input type="checkbox" name="chk2" value="チェック2−2"> </fieldset> <fieldset> <legend>ラジオボタン</legend> <p> 1.<input type="radio" name="radio1" value="ラジオボタン1−1" checked> 2.<input type="radio" name="radio1" value="ラジオボタン1−2"> <p> 1.<input type="radio" name="radio2" value="ラジオボタン2−1"> 2.<input type="radio" name="radio2" value="ラジオボタン2−2" checked> </fieldset> <fieldset> <legend>セレクト</legend> <p> 1.<select name="select1"> <option value="select1_value1">サンプル1</option> <option value="select1_value2" selected>サンプル2</option> <option value="select1_value3">サンプル3</option> </select> <p> 2.複数選択可<br> <select name="select2" multiple> <option value="select2_value1" selected>サンプル1</option> <option value="select2_value2">サンプル2</option> <option value="select2_value3" selected>サンプル3</option> </select> </fieldset> <p> <textarea name="txarea1">適当に変えてください</textarea> </p> <input type="submit" > </form> <form action="#" id="RIGHT-FORM"> <textarea id="RTXAR" rows="30"> ここにフォームの内容が… </textarea> </form> </div> <script type="application/javascript; version=1.6"> var locationSplit = function (url) { return /^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/.exec(url); }; //___ var getQuery = function (querys) { if (! querys) return; var result = { }; // map から弄られる var reg_name_check = /^[^a-z]|[^a-z0-9\-\.\:\_]/i; // map::function デコード var toDecode = function (s) { return decodeURIComponent (s); }; // map::function 配列値を変数名とし、最終値を変数値とするように置き換える // a=b=c -> [a,b,c] -> a=c, b=c; var toSubstituting = function (target, count, all) { var max = all.length - 1; var val = all[max]; check : { if ('' == target) return; if (max == count) return; if (reg_name_check.test (target)) { //@name のチェック(頭だけ) throw new Error; } } entry: { switch (typeof result[target]) { case 'object' : result[target].push (val); //配列に追加 break; case 'undefined' : result[target] = val; // 普通に登録 break; default : result[target] = [result[target], val]; //配列にして再登録 } } }; var toValue = function (query) { query.split (/=/g) .map (toDecode) // "=" で分離してデコード .map (toSubstituting); // 最後を値とし、前を変数とみなし代入 }; querys.replace (/\+/g, ' ') .split (/;|&/g) //+を空白にして区切る .map (toValue); return result; }; //___ // オブジェクトをツリー表示にする function getObjectTree (obj, padding/*空白文字*/, addStr/*付加文字*/) { var result = [ ]; if (! padding) padding = ''; if (! addStr) addStr = ''; (function (ary, index, spc) { var key, val; for (key in ary) { if (ary.hasOwnProperty (key)) { val = ary[key]; if ('object' == typeof val) { result.push (spc + addStr + '"' + key +'"'); arguments.callee (val, key, spc + padding); } else result.push (spc + addStr + '"' + key + '" = "'+ ary[key] +'"'); } } })(obj, 1, ''); return result; } //___ document.getElementById('RTXAR').value = getObjectTree (getQuery (locationSplit (location.href)[7]),'│','├').join("\n"); /* var es = document.getElementById('LEFT-FORM').elements; Array.forEach ( es, function (e,c) { alert("No."+c+":"+e.nodeName); }); */ </script>