タブプラグインを作ってみよう
最近ではWebサイトを制作する際によく使われるのが、
jQueryの場合、
代表的なものでは、
今回の第7回では、
タブパネルを実装するスクリプトを書いてみよう
タブパネルの実装について、
実装方法は様々ですが、
タブパネルを実装するにあたって、
<div class="tabArea">
    <ul class="tab">
        <li><a href="#tab1">tab1</a></li>
        <li><a href="#tab2">tab2</a></li>
    </ul>
    <div id="tab1" class="tabPanel">
        tab1tab1tab1tab1tab1tab1tab1<br />
        tab1tab1tab1tab1tab1tab1tab1<br />
        tab1tab1tab1tab1tab1tab1tab1<br />
        tab1tab1tab1tab1tab1tab1tab1<br />
        tab1tab1tab1tab1tab1tab1tab1<br />
        tab1tab1tab1tab1tab1tab1tab1
    </div>
    <div id="tab2" class="tabPanel">
        tab2tab2tab2tab2tab2tab2tab2<br />
        tab2tab2tab2tab2tab2tab2tab2<br />
        tab2tab2tab2tab2tab2tab2tab2<br />
        tab2tab2tab2tab2tab2tab2tab2<br />
        tab2tab2tab2tab2tab2tab2tab2<br />
        tab2tab2tab2tab2tab2tab2tab2
    </div>
</div>
タブパネルの初期化
順を追って見ていきましょう。
まずは、
var tabArea = $('div.tabArea');
var tabPanel = $('div.tabPanel',tabArea);
var tab = $('ul.tab li',tabArea);
次に、
tabPanel.not(':first').hide();
続いて、
タブも先ほど取得しているので、
tab.eq(0).addClass('active');
ここまでで、
タブをクリックしたときの動作を追加する
タブをクリックしたときに、
tab.click(function(){ /* ここに処理を書いていく */ });
まずは、
試しにconsoleで見てみるとよいでしょう。
consoleには
tab.click(function(){
    var targetTabId = $('a',this).attr('hash');
    console.log(targetTabId);
});
ここまでくればもう完成したようなもので、
- 現在表示されているタブパネルを非表示にして、
 - 選択状態のタブからactiveを取り除き
 - クリックされたタブにactiveを追加
 - 取得した
「#tabId」 のタブパネルを表示する  
の4つです。
実際には、
以上をふまえると、
tab.removeClass('active');
tabPanel.hide();
$(this).addClass('active');
$(targetTabId).show();
これらを先ほどのものと合わせて、
tab.click(function(){
    var targetTabId = $('a',this).attr('hash');
	
    tab.removeClass('active');
    tabPanel.hide();
    $(this).addClass('active');
    $(targetTabId).show();
	
    return false;
});
では、
jQuery(function($){
    var tabArea = $('div.tabArea');
    var tabPanel = $('div.tabPanel',tabArea);
    var tab = $('ul.tab li',tabArea);
	
    tabPanel.not(':first').hide();
	
    tab.eq(0).addClass('active');
    tab.click(function(){
        var targetTabId = $('a',this).attr('hash');
		
        tab.removeClass('active');
        tabPanel.hide();
        $(this).addClass('active');
        $(targetTabId).show();
		
        return false;
    });
});
開いておきたいタブを選択できるように改良する
上記で、
下記の部分で一つ目のタブを開いた状態にしているので、
tabPanel.not(':first').hide();
	
tab.eq(0).addClass('active');
残りの手順としては
- eachメソッドを使い、
classにactiveをもっているタブを探す  - activeをもっていれば、
click時と同じ動作をさせる  - eachメソッド終了後に、
activeになっているタブがなければ、 最初のタブを表示状態にする  
まずはeachメソッドを使ってclassにactiveをもっているタブを探して、あればclick時と同じ動作をさせる 
2つ同時にやってしまいます。
tab.click(function(){
    // a :
    var targetTabId = $('a',this).attr('hash');
    
    tab.removeClass('active');
    tabPanel.hide();
    $(this).addClass('active');
    $(targetTabId).show();
    // : a
    
    return false;
}).each(function(){
    if($(this).hasClass('active')){ // ※1
        // b :
        var targetTabId = $('a',this).attr('hash');
        
        tab.removeClass('active');
        tabPanel.hide();
        $(this).addClass('active');
        $(targetTabId).show();
        // : b
    }
});
eachメソッドで順番に回しているタブのclassにactiveがあるかどうかを確かめるには、
// functionとしてまとめる
var tabSet = function(target){
    var targetTabId = $('a',target).attr('hash');
    
    tab.removeClass('active');
    tabPanel.hide();
    $(target).addClass('active');
    $(targetTabId).show();
}
tab.click(function(){
    tabSet(this); // thisを引数として渡す
    return false;
}).each(function(){
    if($(this).hasClass('active')){
        tabSet(this); // thisを引数として渡す
    }
});
実行時にタブを渡す必要があるので
eachメソッド終了後に、activeになっているタブがなければ、最初のタブを表示状態にする  
最後に選択されているタブがない場合の処理を追加します。選択されているタブがないということは、
ここで、
if(tabPanel.filter(':visible').length!=1){
    tab.eq(0).addClass('active');
    tabPanel.not(':first').hide();
}
これまでのソースコードをまとめるたものが以下になります。
jQuery(function($){
    var tabArea = $('div.tabArea');
    var tabPanel = $('div.tabPanel',tabArea);
    var tab = $('ul.tab li',tabArea);
    
    var tabSet = function(target){
        var targetTabId = $('a',target).attr('hash');
        
        tab.removeClass('active');
        tabPanel.hide();
        $(target).addClass('active');
        $(targetTabId).show();
    }
    
    tab.click(function(){
        tabSet(this);
        return false;
    }).each(function(){
        if($(this).hasClass('active')){
            tabSet(this);
        }
    });
    
    if(tabPanel.filter(':visible').length!=1){
        tab.eq(0).addClass('active');
        tabPanel.not(':first').hide();
    }
});
以上で
今回のまとめ
タブパネルを実装する、
jQueryを使えば、
次回は、

