Подтвердить что ты не робот

В jquery-ui 1.9, как вы создаете новые вкладки динамически?

В соответствии с руководством по обновлению для jquery-ui 1.9 tabs - 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 Tabs: Несоответствие идентификатора фрагмента.

Если я правильно понимаю, эта ошибка означает, что фактическая панель вкладок не создается (и, следовательно, существует несоответствие между панелью навигации и панелью вкладок). Но руководство по обновлению не упоминает о создании панели вкладок.

Поэтому я предполагаю, что либо я делаю это неправильно, либо руководство по обновлению является неполным. Просьба уточнить.

Интересно, что при удалении вкладок руководство по обновлению говорит, что вы должны явно удалять элемент списка с панели навигации, а также панель вкладок явно, поэтому мне интересно, то же самое относится к добавлению вкладок.

4b9b3361

Ответ 1

Руководство должно быть неполным, вам нужно добавить панель вкладок

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

пример

Ответ 2

После каждого добавления вкладки вам нужно создать div для показа содержимого, например, для создания tab number 2

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

проверить скрипт http://jsfiddle.net/AJDLt/1/

Ответ 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

Досадно, что вкладки "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");
};

Ответ 5

Пример описан более подробно здесь, кроме того, существует runnable версия находится на официальном сайте 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");