URLによって挙動を変えるswitch文を書きたく以下のコードで実行するのですが
http://example.com/abc100にアクセスしても、Defaultの結果「100」にしかなりません。
上述URLで「a」がアラート表示して欲しいのですが、こちらはどのように書いたらよいでしょうか?
if(location.href.match(new RegExp(/abc(\d{3}$)/))){
switch (RegExp.$1){
case 100:
window.alert("a");
break;
case 101:
window.alert("b");
break;
case 012:
window.alert("c");
break;
default:
window.alert(RegExp.$1);
}
}
caseの箇所(数値だけなら回答1)と正規表現を修正。
location.hrefはリクエストURLによって最後にスラッシュが付くこともあるので注意。(abc100/ではなく確実にabc100を開くなら関係ないか。自分がハマったのはロケーションバーでco.jpと表示されているのに、location.hrefはco.jp/ だった。)
new RegExp()は文字列から正規表現オブジェクトを作る際に使いますが今回は必要ないと思います。
if (location.href.match(/abc(\d{3})\/?$/)) { switch (RegExp.$1) { case '100': window.alert("a"); break; case '101': window.alert("b"); break; case '012': window.alert("c"); break; default: window.alert(RegExp.$1); } }
以下、IE9での動作確認になります。
以下の変更をすると「a」と表示されました。
前:switch (RegExp.$1){
後:switch ( parseInt(RegExp.$1) ){
解説をすると、RegExp.$1は文字型を返すようです。
switch文では等価演算子「===」により値と型が同じかを評価します。
つまり、一つ目のcase文では「100==="100"」という評価が行われ、
型が異なるためFalseとなります。
switch文 - 条件分岐 - JavaScript入門
文字列型から数値へ変換する関数「parseInt」により、
両者の型を合わせてあげるとうまくいきます。
parseInt関数 - グローバル関数 - JavaScript入門
javascriptでは型をあまり意識しないので、引っかかりやすいですね。
ご回答ありがとうございます。
書いて頂いたコードに修正したところ希望通りに動いてくれました。
caseの箇所(数値だけなら回答1)と正規表現を修正。
location.hrefはリクエストURLによって最後にスラッシュが付くこともあるので注意。(abc100/ではなく確実にabc100を開くなら関係ないか。自分がハマったのはロケーションバーでco.jpと表示されているのに、location.hrefはco.jp/ だった。)
new RegExp()は文字列から正規表現オブジェクトを作る際に使いますが今回は必要ないと思います。
if (location.href.match(/abc(\d{3})\/?$/)) { switch (RegExp.$1) { case '100': window.alert("a"); break; case '101': window.alert("b"); break; case '012': window.alert("c"); break; default: window.alert(RegExp.$1); } }
ご回答ありがとうございます。
RegExp.$1はnew RegExp()じゃないといけないものだと思い込んでいました。
大変勉強になりました。、location.hrefの注意点もありがとうございます。(_ _)
ご回答ありがとうございます。
2012/03/21 10:28:21RegExp.$1はnew RegExp()じゃないといけないものだと思い込んでいました。
大変勉強になりました。、location.hrefの注意点もありがとうございます。(_ _)