0

外部リンクごとにタブ内でアコーディオンを開きたいです。例: www.demosite.com/site#tab1&2 は最初のタブを開き、タブ内で 2 番目のアコーディオンを開きます。

これまでのところ、次のコードで特定のタブを開きます。

$( "#tabs" ).tabs({
  collapsible: true,
  select: function(event, ui) {
    window.location.hash = ui.tab.hash;
  }
});

アコーディオンを開くには、jQuery UI アコーディオンのアクティブ関数を使用する必要がありますが、両方を使用する方法がわかりません。

誰でも私を助けることができますか?

http://jsfiddle.net/bMeLL

4

2 に答える 2

1

ハッシュを分割して、両方の情報を含める必要があります。

例 1: #0|1 は最初のタブと 2 番目のパネルを開きます
例 2: #1|0 は 2 番目のタブと最初のパネルを開きます

そのために、getHash と setHash の 2 つの関数を作成しました。

$(function() {
    $(document).ready(function(){
        var getHash = function(key){
            var parts = window.location.hash.substr(1).split(/\|/);
            var _key = parseInt(key) || 0;
            return _key < parts.length ? parts[_key] : false;
        };
        var setHash = function(key, value){
            var parts = window.location.hash.substr(1).split(/\|/);
            var _key = parseInt(key) || 0;
            parts[_key] = value
            window.location.hash = '#' + parts.join('|');
        };
        $(".accordion").accordion({
            heightStyle: "content",
            collapsible: true,
            animated: 'slide',
            navigation: true,
            activate: function(event, ui) {
                if(ui.newHeader.length > 0){
                    // A new accordion panel is open
                    setHash(1, ui.newHeader.parent().children('h3').index(ui.newHeader));
                }else{
                    // In case accordion panel is closed
                    setHash(1, '');
                }
            },
            active: false
        });

        $( "#tabs" ).tabs({
            collapsible: true,
            activate: function(event, ui) {
                if(ui.newTab.length > 0){
                    // A new tab is open
                    var tabHash = ui.newTab.parent().children().index(ui.newTab);
                    if(tabHash == getHash(0)){
                        // In case current tab is the one in Hash, we open wanted accordion panel
                        // Make sure to parseInt hash value, because jquery-ui require an integer
                        ui.newPanel.find('.accordion').accordion('option', 'active', parseInt(getHash(1)));
                    }else{
                        setHash(1,'');
                    }
                    setHash(0, tabHash);
                }else{
                    // In case we close tab, hash is cleared
                    window.location.hash = ''
                }
            },
            create: function(event, ui){
                if(ui.tab.length > 0){
                    var tabHash = ui.tab.parent().children().index(ui.tab);
                    if(tabHash == getHash(0)){
                        // In case current tab is the one in Hash, we open wanted accordion panel
                        // Make sure to parseInt hash value, because jquery-ui require an integer
                        ui.panel.find('.accordion').accordion('option', 'active', parseInt(getHash(1)));
                    }else{
                        setHash(1,'');
                    }
                    setHash(0, tabHash);
                }
            },
            // Make sure to parseInt hash value, because jquery-ui require an integer
            // Remove the " || 0 " if you want all to be closed
            active: parseInt(getHash(0)) || 0
        });
    });
});

ここでフォークを行いました: http://jsfiddle.net/9nKZp/1/
そして結果はこちら: http://jsfiddle.net/9nKZp/1/show/

于 2013-11-14T16:38:57.007 に答える
1

.accordion()-call では、展開するアコーディオンのインデックスである where を使用しactive: NますN(数値を受け入れますが、フィドルはブール値のように使用します)。

Nここで、ハードコードされた の値ではなく、 の値を提供する必要があります1ui.tab.hashあなたの-methodに基づいて構築するとうまくいくかもしれません。

クエリ文字列パラメーターを取得する方法はいくつかありますが、URL はdemosite.com/site?tab=1&accordion=2. クエリ文字列パラメーターを Javascript 変数に取得する方法について調査します。

これがあなたのフィドルのフォークです

于 2013-11-14T15:39:18.933 に答える