19

根据 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 选项卡:片段标识符不匹配。

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

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

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

4

5 回答 5

38

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

$(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");
    });                    
});

例子

于 2013-02-05T08:09:50.220 回答
4

添加每个选项卡后,您必须创建一个 div 来显示内容,例如创建tab number 2

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

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

于 2013-02-05T08:08:56.047 回答
4

因此,正确的方法就像一个最佳答案,但没有 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);
});
于 2014-01-17T16:16:24.937 回答
4

删除选项卡很烦人"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");
};
于 2015-11-12T10:14:40.813 回答
1

这里更详细地描述了一个示例,并且在 jquery ui 的官方网站上有一个可运行的版本及其源代码。

一个简单的声明可能如下所示:

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");
于 2014-11-18T20:09:51.863 回答