【问题标题】:In jquery-ui 1.9, how do you create new tabs dynamically?在 jquery-ui 1.9 中,如何动态创建新选项卡?
【发布时间】:2013-01-20 02:10:26
【问题描述】:

根据 jquery-ui 1.9 标签的升级指南 - http://jqueryui.com/upgrade-guide/1.9/#deprecated-add-and-remove-methods-and-events-use-refresh-method - 动态添加新标签时,您只需执行以下操作:

HTML:

<div id='tabs'>
    <ul>
        <li><a href='#tab1'>#1</a></li>
    </ul>
    <div id='tab1'></div>
</div>
<button id='add-tab'>Add tab</button>

JavaScript:

$(document).ready(function() {
    $("div#tabs").tabs();

    $("button#add-tab").click(function() {

        var num_tabs = $("div#tabs ul li").length + 1;

        $("div#tabs ul").append(
            "<li><a href='#tab" + num_tabs + "'>#" + num_tabs + "</a></li>"
        );

        $("div#tabs").tabs("refresh");
    });                    
});

但是,当我尝试在新创建的选项卡之间进行更改时,我在 firebug 中收到以下错误:

jQuery UI 选项卡:片段标识符不匹配。

如果我理解正确,这个错误意味着没有创建实际的选项卡面板(因此导航面板和选项卡面板之间存在不匹配)。但是升级指南没有提到创建标签面板。

所以我假设我做错了,或者升级指南不完整。请澄清。

有趣的是,在删除选项卡时,升级指南说您必须从导航面板和选项卡面板中显式删除列表项,所以我想知道添加选项卡是否同样适用。

【问题讨论】:

  • 将您的确切代码复制粘贴到 jsFiddle 中,它可以正常工作。 jsfiddle.net/rMGCM你确定这就是你所做的一切吗?
  • 谢谢克里皮。您是否尝试在选项卡之间进行更改?如果这样做,您将看到不匹配错误。唯一修复它的是添加: $("div#tabs").append("
    Tab " + num_tabs + "
    ");但这在文档中没有提到。
  • 官方指南以及如何在 JQuery UI 中动态添加和删除选项卡的来源:jqueryui.com/tabs/#manipulation

标签: jquery-ui tabs


【解决方案1】:

标签"add" 被删除很烦人,但是jQuery 很容易扩展。只需添加您自己的 addTab 方法。

例如像这样的:

// jQuery extension method
$.fn.addTab = function (name) {
    $('ul', this).append('<li><a href="#tab-' + name + '">' + name + '</a></li>');
    $(this).append("<div id='tab-" + name + "'></div>");
    $(this).tabs("refresh");
};

然后像这样简单地使用:

$('#tabs').addTab("NewTab");
$('#tabs').addTab("Another NewTab");
$('#tabs').addTab("etc");

JSFiddle: http://jsfiddle.net/TrueBlueAussie/AJDLt/315/

按照@Andy 的建议,如果您在界面中嵌套选项卡,则需要使用.first()

例如像这样的:

// jQuery extension method
$.fn.addTab = function (name) {
    $('ul', this).first().append('<li><a href="#tab-' + name + '">' + name + '</a></li>');
    $(this).append("<div id='tab-" + name + "'></div>");
    $(this).tabs("refresh");
};

【讨论】:

  • 如果您正在修改的选项卡包含子选项卡面板,则此解决方案不起作用。它还将标签添加到每个标签。
  • 把它改成 "$('ul', this).first()..." 让它按预期工作。
【解决方案2】:

更详细地描述了一个示例here 此外,jquery ui 的官方网站上还有一个runnable version 及其源代码。

一个简单的声明可能是这样的:

var addTab = function (tabs, tabId, tabLabel, tabContentHtml) {
     var header = "<li><a href='#" + tabId + "'>" + tabLabel + "</a> </li>"
     tabs.find(".ui-tabs-nav").append(header);
     tabs.append("<div id='" + tabId + "'><p>" + tabContentHtml + "</p></div>");
     tabs.tabs("refresh");
};

添加新标签变得越来越容易,只需输入以下内容:

$("#tabs_area").tabs();
addTab($("#tabs_area"), "tab_id1", "Tab 1", "this is just test");

【讨论】:

  • 谢谢你;我看到旧代码仍然有效。这有点可惜,因为您的解决方案要优雅得多。你认为它会保持向后兼容吗?全面更新它会很痛苦。
【解决方案3】:

所以,正确的方法就像一个最佳答案,但没有 nub_tabs。

$("div#tabs").tabs();
var tab_id = 1;
$("button#add-tab").click(function() {
    tab_id++; //It can be any id;

    $("div#tabs ul").append(
    '<li id="'+tab_id+'"><a href="#tab"'+tab_id+'">#"+tab_id+"</a><i class="close-tab" target="'+tab_id+'"></i></li>');
$("div#tabs").append(
    '<div id="'+tab_id+'">#'+tab_id+'</div>');
    $("div#tabs").tabs("refresh");
});

//Now i want to show some functions from my code;
//It will not work for you, just want show the idea;

//No clone tabs

function if_tab_exist(thisI) { //thisI - contains some id, title and text for tab content.
    var tab_id = $(thisI).attr('id');
    if(!$('.ui-tabs-nav li#'+tab_id).is('*')) {
        addTab(thisI); //Add tab function
    } else {
        var TAB_index = $('.ui-tabs-nav li#'+tab_id).index();
        $("#tabs").tabs({active: TAB_index}); //Will activate already exist tab
    }
}

//Close tab
function close_tab(tab_id) {
    $('.ui-tabs-nav i[target='+tab_id+']').parent().remove();       
    $('#tabs div#'+tab_id+']').remove();
    $("#tabs").tabs("refresh");
}
//Events
//CLose
$("body").on('click','.ui-tabs-nav .ui-state-default i', function() {
    close_tab($(this).attr('target'));
});
//Add
$("body").on('click','.addTab', function() {
    if_tab_exist(this);
});

【讨论】:

【解决方案4】:

指南一定不完整,需要添加标签面板

$(document).ready(function() {
    $("div#tabs").tabs();

    $("button#add-tab").click(function() {

        var num_tabs = $("div#tabs ul li").length + 1;

        $("div#tabs ul").append(
            "<li><a href='#tab" + num_tabs + "'>#" + num_tabs + "</a></li>"
        );
$("div#tabs").append(
            "<div id='tab" + num_tabs + "'>#" + num_tabs + "</div>"
        );
        $("div#tabs").tabs("refresh");
    });                    
});

example

【讨论】:

  • 感谢 axrwkr。效果很好。不能说我非常喜欢我们现在必须采取的额外步骤来添加标签。我更喜欢旧的使用方式 $("div#tabs").tabs("add", ...);当然,这种新方法更灵活,但旧方法对于那些不需要灵活性的简单案例来说既快速又简单。
  • num_tabs 不是个好主意,为什么?例如,我们打开 3 个选项卡。所以最后一个有num_tabs = 3,然后我们用num_tabs=1关闭第一个标签,现在当我们尝试添加新标签时,tabs = 3的计数var num_tabs = $("div#tabs ul li").length + 1;所以我们尝试添加新标签相同的 id 已经存在。所以这是一种错误的方式。我需要一些时间来解决,并将在下面打印我的代码。
  • @Jek-fdrv 我理解你的推理,但如果不需要删除标签,我觉得你已经过度设计了。从这个意义上说,我提出的解决方案是正确的方法,因为它只做需要做的事情,仅此而已。
【解决方案5】:

在添加每个标签后,您必须创建一个 div 来显示内容,例如创建 tab number 2

$("div#tabs").append("<div id='tab"+num_tabs+"'></div>");

检查小提琴http://jsfiddle.net/AJDLt/1/

【讨论】:

  • 谢谢罗汉。是的,这与我得出的结论几乎相同。我只是想知道为什么文档中没有提到这一点。有什么想法吗?
  • 你应该使用 add 的方法 jquery ui $('div#tabs').tabs('add', 'tab'+num_tabs, num_tabs); 在这里检查小提琴 jsfiddle.net/AJDLt/3 在这种情况下你不必应用你自己的逻辑它会自动添加一个新标签,您可以根据自己的逻辑创建其 id。
  • 嘿 Rohan,''add'' 方法在 jquery-ui 1.9 中已弃用,并在 1.10 中完全删除。因此,关于 SO 的这个问题。
  • 好的,但我认为可能有其他选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 2018-12-08
  • 2013-01-31
相关资源
最近更新 更多