【问题标题】:jQuery UI - Open Accordion within Tabs with an external linkjQuery UI - 使用外部链接在选项卡中打开手风琴
【发布时间】:2013-11-14 15:26:50
【问题描述】:

我想在每个外部链接的选项卡中打开 Accordion。例如:www.demosite.com/site#tab1&2 应该打开第一个选项卡并在选项卡内打开第二个手风琴。

到目前为止,我使用以下代码打开了特定的选项卡:

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

为了打开 Accordion,我应该使用 jQuery UI Accordion 的 active Function,但我不知道如何同时使用这两种功能。

谁能帮帮我?

http://jsfiddle.net/bMeLL

【问题讨论】:

  • 外部链接来自同一个域。这是关于交叉链接两个网站
  • 哦误读了这个问题。所以你想要某种在其内容中打开选项卡和手风琴的语法?所以#tab1&2 = 打开tab1,然后在内容部分打开手风琴2?
  • 是的,那太好了

标签: javascript jquery jquery-ui tabs accordion


【解决方案1】:

您应该拆分散列,以便在其中包含两个信息。

示例 1:#0|1 将打开第一个选项卡和第二个面板
示例 2:#1|0 将打开第二个选项卡和第一个面板

为此,我创建了 2 个函数:getHash 和 setHash。

$(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/

【讨论】:

  • 太棒了!就像我想象的那样。谢谢
  • 例如,如果我创建一个&lt;a href="#3|0"&gt;click here&lt;/a&gt; 并单击它,它不起作用,只有将它放在地址栏中,哈希才有效,有什么解决方案吗?
【解决方案2】:

.accordion()-调用中,您想使用active: N,其中N 是您要扩展的手风琴的索引(它接受一个数字,但您的小提琴将它用作布尔值)。

现在您只需要提供N 的值,而不是我的硬编码值1。建立在您的ui.tab.hash-方法上可能会起作用。

检索查询字符串参数有几种不同的方法,但您的 URL 必须类似于 demosite.com/site?tab=1&amp;accordion=2。研究如何将查询字符串参数转换为 Javascript 变量。

Here's a fork of your fiddle

【讨论】:

  • 这个答案是错误的,我已经更新了小提琴和答案。
  • 太好了,我会调查的。唯一的问题是,在每个选项卡中都会打开第二个手风琴。我可以做点什么,假装这样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 2013-06-19
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多