jQuery3系でやっていく。
追記:20210118
バージョンアップしました
やりたいこと
「http://example.com/#hogehoge」じゃなくて
「http://example.com/?hoge=hogehoge」のやつでやりたい。
たとえばタブの切替なんかはハッシュタグでもできるんだけど、ハッシュタグはページ内リンクでも使う点、1度に1つだけって制限がある。
パラメータだったらidと完全に差別化できる(≒ページ内リンクと切り離せる)し、複数指定もできる。
複数指定できるってことは、ページ内に複数のタブを設置してても一括で管理できる。
環境
jQuery3系
ソース
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
<script src="script.js"></script>
<nav>
<ul>
<li><a class="nav01" href="?id=id01">id=id01</a></li>
<li><a class="nav02" href="?id=id02">id=id02</a></li>
<li><a class="nav03" href="?id=id03">id=id03</a></li>
<li><a class="nav04" href="?id=id04">id=id04</a></li>
</ul>
</nav>
<ul class="tab">
<li class="id01">id=id01</li>
<li class="id02">id=id02</li>
<li class="id03">id=id03</li>
<li class="id04">id=id04</li>
</ul>
$(function(){
'use strict';
$('nav ul li a').removeClass('active');
$('ul.tab li').hide();
var urlParam = location.search.substring(1);
if(urlParam) {
var param = urlParam.split('&');
var paramArray = [];
for (var i = 0; i < param.length; i++) { var paramItem = param[i].split('='); paramArray[paramItem[0]] = paramItem[1]; } if(paramArray.id == "id01"){ $('nav ul li a.nav01').addClass('active'); $('ul.tab li.id01').show(); } if(paramArray.id == "id02"){ $('nav ul li a.nav02').addClass('active'); $('ul.tab li.id02').show(); } if(paramArray.id == "id03"){ $('nav ul li a.nav03').addClass('active'); $('ul.tab li.id03').show(); } if(paramArray.id == "id04"){ $('nav ul li a.nav04').addClass('active'); $('ul.tab li.id04').show(); } } });
クリックしたら該当のul.tab liが表示される。 どれが効いてるか分かるようにクリックしたやつにactiveを付与する。 非表示もjsでやってるから一瞬全部表示されるんで、実際にはcssでdisplay:none;を付けとくといい。
簡単な解説
urlからパラメータを抜き取り、「?」を外して「=」を区切りにして連想配列化。
パラメータが複数ある場合(?id01=aaa&id02=bbb)は「&」で区切ってそれぞれ格納。
ifで変数を指定して、記述内容により個別に処理する。
ぶっちゃけ検索すればたくさん出てくるレベルのことなので何も珍しいことはない。
詳細に書いてるとこもあるだろうから、ちゃんとした説明が欲しい場合は探してみるといいです。
注意点
記事を漁ってて気がついたんだけど、「var」が抜けてるせいで機能しないソースが大量に転がっていた。
その点を修正したからこれは動く。
変数名は好きにすればいいけど構成はこれを維持すること。
まとめというか
パラメータ入れまくるとurlが汚く(長く)なるんで気になるならついでに上書きしちゃえばいいけどそうすると他所に投げる時にめんどくさくなるから、ステータスを持っていけるんだって納得するのがいいと思う。
まあコンテンツにもよるし、使い分けですね。
コメント