< モジュールのインストール(CPANを使用する場合) | Tabular Data ControlのFilterプロパティ >

October 10, 2003

Javascript版 location.search汎用クラス

URLが、
hoge.html?param1=0001¶m2=0002
のばあい、'?'以降を、ブラウザオブジェクトでは、window.location.searchとして取得することができる。
※ 正確にはsearchの部分はURLに含まないらしい。
これを分割して、連想配列のように取得するクラスを作ってみた。

var oSearch = new CLocationSearch(location.search);
document.write(oSearch.item('param1');
のように使うことができる。

function CLocationSearch(sSource) {
	
	/* 初期化処理 */
	var sAry = new Array();	/* アイテム配列を追加 */
	{
		var nCur = 0, nRet = 0;
		var sSearch = sSource.substr(1);
		var sName, sValue;
				
		nRet = sSearch.indexOf('=', nCur)		// 最初の'='を検索
		while(nRet >= 0) {
			// '='以前が変数名
			sName = sSearch.substring(nCur, nRet);
			nCur = nRet + 1;
			
			// 値を取り出す
			nRet = sSearch.indexOf('&', nCur);	// 変数の区切りを検索
			if (nRet == -1) nRet = sSearch.length + 1;		// なければ最後まで
			sValue = sSearch.substring(nCur, nRet);
			
			// 配列に格納
			sAry[sName] = sValue;
			
			// 次を検索
			nCur = nRet + 1;
			nRet = sSearch.indexOf('=', nCur);
		}
	}
	
	/* 値 */
	this.valueOf = function () {
		return sSource;
	}
	
	/* 値を取り出すメソッド */
	this.item = function (sVarname) {
		try {
			return sAry[sVarname];	//あれば返す
		} catch(e) {
			return '';				//なければ空文字を返す
		}
	}
	
	/* 要素数 */
	this.length   = function () {
		return sAry.length;
	}
	
	/* toString */
	this.toString = function () {
		return this.length + '';
	}
	
}

2010.08.26 おまけ。最近こんなんも作った。おんなじパラメータ名が複数ある場合は配列にまとめちゃいます。


<script type="text/javascript">
//<![CDATA[
window.location.searchArray || (function ()
    {
        var source = window.location.search.substr (1);
        var regex = /([^&?=]+)=([^&?=]+)/g;
        var result = [];
        
        var match = [];
        while (match = regex.exec (source))
        {
            var key = unescape (match[1].replace ("+", " "));
            var val = unescape (match[2].replace ("+", " "));
            if (key in result)
                result [key].push (val);
            else
                result [key] = [val, ];
        }
        
        location.searchArray = [];
        for (var key in result)
            location.searchArray[key] = (result[key].length == 1)? result[key][0]: result[key];
    } ());

document.write ('<pre>');
for (var k in location.searchArray)
    document.writeln (k + ":" + location.searchArray[k]);
document.write ('</pre>');
//]]>
</script>

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/65

コメント

こんにちは、kioskと申します。
ちょうどlocation.searchの汎用関数を探していたので助かりました。

こんにちわ、kiosk さん。
コメントありがとうございます。
あんまりきれいな作りじゃなくて恐縮です。

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?