yamachan Ajax/.NET/C# メモ

2007-01-22

[JS] URLパラメータを得る関数

久しぶりに JavaScript を書いていて、URL パラメーターの値を入手する関数が必要になりました。 例えば、
http://yamachan-memo.blogspot.com/index.html?foo=12&bar=13
というURLだと、fooで12、barで13という値を得る方法。 Domino だと @UrlQueryString("foo") とかで一発なんだけど。

どっかにありそうと思って探したんだけど、うまく見つからなかった。 ざっと書いたものだけど、メモとして貼っておきます。
var foo = jp.rinco.parseURL(location.search, "foo", "haha");
var bar = jp.rinco.parseURL(location.search, "bar", "hehe");
とか使います。

ちなみに最後の引数は、該当するパラメータが見つからない場合のデフォルト値です。 必要がない場合には "" を指定してください。

jp.rinco.parseURL = function(url, name, value){
var pos_s = url.indexOf(name + "=");
if(pos_s < 0)
return value;
var url = url.substring(pos_s+name.length+1);
var pos_e = url.indexOf('&');
if (pos_e < 0)
return decodeURIComponent(url);
return decodeURIComponent(
url.substring(0, pos_e));
}


2007/1/29 追記: 戻り値を decodeURIComponent() するように修正
2007/2/27 追記: jp.rincoオブジェクト へ移動
2007/3/13 追記:

jp.rinco.url 内に移動&バグ修正

以下は jp.rinco.url 内に移動したロジックです。 jp.rinco.url は単なるインスタンスで、その実装は jp.rinco.urlTool となっています。 parse() 関数部分のみ貼っておきます。

this.parse = function(v1, v2, v3) {
var u; var n; var d;
if (v2 == undefined) {
u = this.param; n = v1; d = "";
} else if (v3 == undefined) {
u = this.param; n = v1; d = v2;
} else {
u = v1; n = v2; d = v3;
}

var pos = u.indexOf("?" + n + "=");
if(pos < 0)
pos = u.indexOf("&" + n + "=");
if(pos < 0)
return d;

var r = u.substring(pos + n.length + 2);
pos = r.indexOf('&');
if (pos < 0)
return decodeURIComponent(r);
return decodeURIComponent(r.substring(0, pos));
}

引数が3つの場合は従来の parseURL と同じ動作をします。 最初の url 引数は省略でき、その場合は現在の URL に対する動作になります。 最後のデフォルト値も省略できます。
var foo = jp.rinco.url.parse("foo.htm&a=1","foo", "haha");
var bar = jp.rinco.url.parse("bar", "hehe");
var puu = jp.rinco.url.parse("puu");
とか使います。

また "a=1" が "aa=1" にマッチしてしまう不具合がありましたので、修正してあります。

なお jp.rinco.url には現在のファイル名(例: このページだと"js-url.html")を得る file 属性など、url 処理に関する便利な機能を実装しています。 気が向いたら参考にしてみてください。