【问题标题】:jQuery tabs selecting specific tab选择特定选项卡的 jQuery 选项卡
【发布时间】:2010-07-01 22:29:06
【问题描述】:

我有一个包含一组 jQuery 选项卡的页面。所有选项卡都指向同一个目标 div,但通过 ajax 加载不同的内容。当我执行初始整页加载时,我需要根据各种因素设置不同的活动选项卡。目标 div 中的内容已经在服务器上设置为这个初始加载,所以我不需要单击选项卡,我只需要将正确的选项卡设置为“已选择”。我尝试将相关“li”html元素的类设置为“ui-tabs-selected”。这具有最初的预期效果,但是一旦加载页面,然后在选择另一个选项卡时,预选的选项卡不会关闭,而是选择了两个选项卡。

那么,有没有人知道另一种方法来预选一个选项卡(不会导致它被点击),或者我看到的奇怪的“ui-tabs-selected”行为的解决方案。

谢谢。

<script type="text/javascript">
    $(function() {
        $("#panelTabs").tabs({
            ajaxOptions: {
                error: function(xhr, status, index, anchor) {
                    $(anchor.hash).html("Couldn't load this tab. We'll try to fix this as soon as possible.");
                }
            }
        });

        $("#panelTabs").tabs({
            select: function(event, ui) {
                getPage('hps.aspx?cmd=zz_' + ui.tab.id, 'panelA');
            }
        });
    });
    </script>

以及构建 UL 的 C# 片段:

StringBuilder tabsLiteral = new StringBuilder();
            tabsLiteral.Append("<ul>");
            foreach (KeyValuePair<string, Tab> kvp in tabs)
            {
                tabsLiteral.Append("<li>");
                // Note - the kvp.Value.URI determines what should happen when the Tab is clicked
                tabsLiteral.Append("<a id=\"" + kvp.Value.URI + "\" href=\"#panelTabs\">" + kvp.Value.Caption + "</a>");
                tabsLiteral.Append("</li>");
            }
            tabsLiteral.Append("</ul>");
            _panelTabs.Controls.Add(new LiteralControl(tabsLiteral.ToString()));

            HtmlGenericControl ctl = new HtmlGenericControl();
            StringBuilder html = new StringBuilder();
            html.Append("<script type=\"text/javascript\">");
            html.Append("$(\"#panelTabs\").tabs({selected: 2});");
            html.Append("</script>");
            ctl.InnerHtml = html.ToString();
            _panelTabs.Controls.Add(ctl);

另一个版本:

StringBuilder tabsLiteral = new StringBuilder();
            tabsLiteral.Append("<ul>");
            foreach (KeyValuePair<string, Tab> kvp in tabs)
            {
                string active = "";
                if (currentTabCaption == kvp.Value.Caption)
                {
                    //active = " class=\"ui-tabs-selected\"";
                }
                tabsLiteral.Append("<li" + active + ">");
                // Note - the kvp.Value.URI determines what should happen when the Tab is clicked
                tabsLiteral.Append("<a id=\"" + kvp.Value.URI + "\" href=\"#panelTabs\">" + kvp.Value.Caption + "</a>");
                tabsLiteral.Append("</li>");
            }
            tabsLiteral.Append("</ul>");
            _panelTabs.Controls.Add(new LiteralControl(tabsLiteral.ToString()));

            HtmlGenericControl ctl = new HtmlGenericControl();
            StringBuilder html = new StringBuilder();
            html.Append("<script type=\"text/javascript\">");
            //html.Append("$(\"#panelTabs\").tabs('option','selected', 2);"); 
            html.Append(@"$(function() {
                alert('initialising tabs');
                $(""#panelTabs"").tabs({
                    ajaxOptions: {
                        error: function(xhr, status, index, anchor) {
                            $(anchor.hash).html(""Couldn't load this tab. We'll try to fix this as soon as possible."");
                        }
                    },
                    select: function(event, ui) {
                        getPage('hps.aspx?cmd=zz_' + ui.tab.id, 'panelA');
                    }
                });
            });");
            html.Append("$(\"#panelTabs\").tabs({selected: 2});");
            html.Append("</script>");
            ctl.InnerHtml = html.ToString();
            //_panelTabs.Controls.Add(ctl);
            Page.Controls.Add(ctl);

【问题讨论】:

  • 你有一个代码示例来展示这一点吗?
  • 请注意确定这是否是您所追求的,但这里是构建 li 的 C# 片段: if (currentTabCaption == kvp.Value.Caption) { active = " class=\"ui -tabs-selected\""; } tabsLiteral.Append("
  • "); // 注意 - kvp.Value.URI 确定点击 Tab 时应该发生什么 tabsLiteral.Append(" " + kvp.Value.Caption + ""); tabsLiteral.Append("
  • ");

标签: jquery tabs jquery-ui-tabs


【解决方案1】:

您正在寻找的是selected option。例如

$("#MyTabs").tabs({
  selected: 2 
});

【讨论】:

  • @Gert G - 谢谢,它最初有效,但随后表现出与添加到 li 元素的“ui-tabs-selected”类完全相同的行为,即单击另一个选项卡时我最终得到两个选择的标签。再次单击时,它会自行排序,只有一个选项卡显示为选中状态。
  • @DEH - 我从来没有遇到过问题。你可以在你的问题中发布一些代码吗?谢谢。
  • 这应该可以。 @DEH 在您的问题中发布您的标记和任何相关的 JS。
  • @Gert G - 我刚刚在最初的帖子中添加了几个代码片段。整个系统相当复杂,所以我不能轻易地发布一个完整的工作示例,但希望这些片段能让你看到我在做什么。我为名为 panelTabs 的选项卡使用了一个通用 div,它是由早期的 C# 动态添加到页面中的。 javascript 只是位于主页的顶部。
  • 谢谢。它为您提供了一些关于它是如何构建的线索。如果在 getPage('hps.aspx?cmd=zz_' + ui.tab.id, 'panelA'); 之后添加 $("#panelTabs").tabs({selected: ui.tab.id }); 并从 C# 代码中删除 html.Append("$(\"#panelTabs\").tabs({selected: 2});"); 会发生什么?在黑暗中拍摄,但也许值得一试。
【解决方案2】:

您可以让选项卡切换功能中的第一行删除选定的类:

var uiTabsSelected = '.ui-tabs-selected';
$(uiTabsSelected).removeClass(uiTabsSelected);

【讨论】:

  • 谢谢,听起来是个好主意 - 我尝试将你的两行粘贴到函数中,但 js 抱怨第一行(期望 ; 在第一个 '-' 字符处) - 有什么想法吗?
【解决方案3】:

改变这个:

html.Append("$(\"#panelTabs\").tabs({selected: 2});");

到这里:

html.Append("$(\"#panelTabs\").tabs('option','selected', 2);");

编辑: 还有……

$(function() {
        $("#panelTabs").tabs({
            ajaxOptions: {
                error: function(xhr, status, index, anchor) {
                    $(anchor.hash).html("Couldn't load this tab. We'll try to fix this as soon as possible.");
                }},
            select: function(event, ui) {
                getPage('hps.aspx?cmd=zz_' + ui.tab.id, 'panelA');
            }
        });    

    });

【讨论】:

  • 在我的测试中根本没有选择一个选项卡,而早期版本确实选择了一个选项卡但在单击另一个选项卡时没有“释放”它。
  • @DEH 去掉 html.append... 行,添加一个隐藏字段来保存所选选项卡的值,然后添加:" ,selected: $('[id*=" TabToSelect"]').val()" 到你的初始化脚本,在代码隐藏中设置 TabToSelect 的值
  • @DEH 我之前省略了一个 }。此外,如果您在初始化选项卡后尝试选择选项卡,它将调用您的选择事件。这是一个简单的例子:jsbin.com/anitu3
  • 感谢您的帮助 - 现在必须离开,但明天会再次查看
【解决方案4】:

如果其他人来这里寻找答案,当前(截至此日期)选择选项卡(jQuery UI 1.10)的方法是使用“活动”选项:

使用指定的活动选项初始化选项卡:

$( ".selector" ).tabs({ active: 1 });

http://api.jqueryui.com/tabs/#option-active

【讨论】:

    【解决方案5】:

    正如 ethagnawl 建议的那样,解决方案是添加和删除类。以下 C# 显示了正在构建的 UL,以及所需的 jQuery 脚本注入。重要的一点在 show: 操作类的函数中。正是这段代码解决了这个问题。

    StringBuilder tabsLiteral = new StringBuilder();
                tabsLiteral.Append("<ul>");
                foreach (KeyValuePair<string, Tab> kvp in tabs)
                {
                    //string tabClass = " class=\"ui-state-default\"";
                    string tabClass = " class=\"ui-state-default\"";
                    if (currentTabCaption == kvp.Value.Caption)
                    {
                        tabClass = " class=\"ui-tabs-selected\"";
                    }
                    tabsLiteral.Append("<li" + tabClass + ">");
                    //tabsLiteral.Append("<li>");
                    // Note - the kvp.Value.URI determines what should happen when the Tab is clicked
                    tabsLiteral.Append("<a id=\"" + kvp.Value.URI + "\" href=\"#panelTabs\">" + kvp.Value.Caption + "</a>");
                    tabsLiteral.Append("</li>");
                }
                tabsLiteral.Append("</ul>");
                _panelTabs.Controls.Add(new LiteralControl(tabsLiteral.ToString()));
    
                HtmlGenericControl ctl = new HtmlGenericControl();
                StringBuilder html = new StringBuilder();
                html.Append("<script type=\"text/javascript\">");
                //html.Append("$(\"#panelTabs\").tabs('option','selected', 2);"); 
                html.Append(@"$(function() {
                    $('#panelTabs').tabs({
                        select: function(event, ui) {
                            getPage('hps.aspx?cmd=zz_' + ui.tab.id, 'panelA');
                        },
                        show: function(event, ui) {
                            // You MUST set both 'ui-state-active' AND 'ui-tabs-selected' for tab UI to operate properly - if either are missing it doesn't work
                            $('.ui-tabs-selected').removeClass('ui-state-active').removeClass('ui-tabs-selected'); 
                            $(ui.tab).addClass('ui-state-active').addClass('ui-tabs-selected'); 
    
                            //$('#panelTabs').tabs('selected',idx); // WOULD have been nice if this had worked, but UI does not keep up
                         }
                    });
                });");
                html.Append("</script>");
                ctl.InnerHtml = html.ToString();
                //Page.Header.Controls.Add(ctl); // NEVER place script in the page header when the script must survive an AJAX delivery - it won't run
                Page.Controls.Add(ctl); // Acceptable to place script on the page, as it WILL survive AJAX delivery
    

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签