WEBOPIXEL

jQueryで現在のページの所属しているサブメニューを開いた状態にする。

Posted: 2010.11.27 / Category: javascript / Tag: ,

タイトルすごくわかりにくいですね。
よく現在のページのaタグにクラスを適用させて、背景画像を変えたりすることがあると思いますが、似たような感じでサブメニューバージョンで開いた状態にしてしまおうというコーナーです。
かなり効率悪いことしている気がしますが、、、

Sponsored Link

html+cssの準備

たとえばこんなファイル構成だったとします。

ディレクトリ構成

リストでマークアップするとこんな感じになるんじゃないかな。

html

	<ul id="side-nav">
		<li><a href="01.html">メニュー1</a></li>
		<li><a href="02.html">メニュー2</a></li>
		<li>
			<a href="03.html">メニュー3</a>
			<ul id="sub01">
				<li><a href="sub01/01.html">サブメニュー1</a></li>
				<li><a href="sub01/02.html">サブメニュー2</a></li>
				<li><a href="sub01/03.html">サブメニュー3</a></li>
			</ul>
		</li>
		<li>
			<a href="04.html">メニュー4</a>
			<ul id="sub02">
				<li><a href="sub02/01.html">サブメニュー1</a></li>
				<li><a href="sub02/02.html">サブメニュー2</a></li>
				<li><a href="sub02/03.html">サブメニュー3</a></li>
			</ul>
		</li>
	</ul>
	

かなり効率悪いで、子メニューのあるulにはidにディレクトリ名を指定しなくてはいけません。

css

	ul ul {
		display: none;
	}
	ul ul.active {
		display: block;
	}
	

子メニューのulは「display: none」で消しときます。
あとでjavascriptでクラスに「active」を指定すれば表示できる寸法。

サブメニューを開いた状態にするjavascript

javascriptでは現在のページの親ディレクトリを取得して、正規表現であらかじめ指定しておいたディレクトリ名のidとマッチさせ置き換えます。

javascript

	$(function() {
		//現在のURLを配列で取得	  	
		var now = location.href.split('/');
		//親のディレクトリ取得
		var dir = now.slice(now.length-2,now.length-1);
		var reg = new RegExp('(id=¥"'+dir+'¥"|id='+dir+')');
		$('#side-nav').each(function(){
			var txt = $(this).html();
			$(this).html(
				txt.replace(reg,'$1 class=¥"active¥"')
			);
		});
	});
	

※¥の部分は打ち直さないと実行できないかもしれません。

【3~5行目】
コメントの通りですが、現在のURLを取得して最後から2番目の配列を取得することで、親ディレクトリの文字列を取得しています。
【6行目】
正規表現です。変数を正規表現に入れる場合はRegExpオブジェクトを使用する必要があるようです。
注意点としてはieの場合「""」が外れて「id=sub01」となるので2つ検索しています。
【7~12行目】
ここで置き換え処理をしています。
マッチしたidがあったら「class="active"」を追加しています。

サブメニューのあるサイドメニューはアコーディオンを使用する方法が基本だと思いますが、アコーディオンにすると親のボタンが使用できなくなるので、それではまずいといったケースだったら使用できるのではないかと思います。
でも、もっと良い方法があると思います……。

参考サイト

【jQuery】ナビゲーションでの現在位置