Вкладки пользовательского интерфейса jQuery - Как получить указатель выбранных вкладок

Я знаю, что этот конкретный вопрос задавался раньше, но я не получаю никаких результаты с использованием события bind() в плагине jQuery UI Tabs.

Мне просто нужен index вновь выбранной вкладки, чтобы выполнить действие при щелчке по вкладке. bind() позволяет мне подключиться к событию select, но мой обычный метод получения текущей выбранной вкладки не работает. Он возвращает ранее выбранный индекс вкладки, а не новый:

var selectedTab = $("#TabList").tabs().data("selected.tabs");

Вот код, который я пытаюсь использовать, чтобы получить текущую выбранную вкладку:

$("#TabList").bind("tabsselect", function(event, ui) {

});

Когда я использую этот код, объект ui возвращается undefined. Из документации это должен быть объект, который я использую для подключения к вновь выбранному индексу с помощью ui.tab. Я пробовал это при первом вызове tabs(), а также самостоятельно. Я что-то здесь делаю не так?


person Mark Struzinski    schedule 18.11.2008    source источник


Ответы (19)


Для версий JQuery UI до 1.9: ui.index из event - это то, что вам нужно.

Для JQuery UI 1.9 или более поздней версии: см. ответ Джорджио Лупарии ниже.

person redsquare    schedule 18.11.2008
comment
Очень хороший ответ! Я включил краткое изложение того, что вы сделали, на веб-сайт, чтобы было легче получить ответ. - person torial; 19.11.2008
comment
Ура, Q упомянул, что объект ui был нулевым, поэтому ui.index в настоящее время не работает. Я думаю, что ответ, возможно, не так прост, как включить это. - person redsquare; 19.11.2008
comment
Это был прекрасный ответ, спасибо за отличный пример! Я пытался сделать все за один снимок, и это не сработало. После того, как я его разделил, все заработало, как было заявлено. - person Mark Struzinski; 19.11.2008
comment
Отлично ... ваша ссылка больше не работает. Почему бы вам просто не опубликовать ответ, чтобы люди, которые придут, тоже увидели решение. - person Ryan; 05.11.2009
comment
Ответ есть - используйте свойство ui.index, чтобы получить текущий индекс в событии tabselect ..... - person redsquare; 05.11.2009
comment
Я не совсем понимаю. Как мне получить текущую выбранную вкладку? $ ('. selector'). tabs ('option', 'ui.index') не работает, потому что это не вариант. - person Patrick Szalapski; 10.12.2011
comment
@Patrick Szalapski $ ('# TabContainer'). Tabs (опция, выбрана); - person redsquare; 12.12.2011
comment
@redsquare, это не работает - он дает мне только выбранную вкладку по умолчанию, а не динамически изменяющуюся выбранную вкладку. - person Patrick Szalapski; 12.12.2011
comment
Можете ли вы запустить демо на jsfiddle. $ ('# TabContainer'). Tabs (опция, выбрана); должен дать вам текущую выбранную вкладку - person redsquare; 12.12.2011
comment
Ответ следует обновить, потому что он не работает с JQuery UI 1.9.0. Вы должны изменить ui.index с помощью ui.newTab.index () в соответствии с Руководством по обновлению (jqueryui.com/upgrade-guide/1.9/) - person Giorgio Luparia; 19.10.2012
comment
@ Джорджио Лупария, почему? Можете ли вы представить, что всем нужно обновлять свои ответы для каждой новой версии каждого фреймворка ... настоящая проблема в том, что вопросы не помечены версиями - person redsquare; 19.10.2012
comment
@redsquare Я уже отправил правку на экспертную оценку. Было бы полезно получить общий ответ: для версий ниже 1.9.0 сделайте это, для версий выше сделайте то же. Но, возможно, я не следую хорошей практике. Должен ли я отправить и ответить на новый идентичный вопрос / ответ, помеченный версиями? - person Giorgio Luparia; 19.10.2012
comment
@Giorgio Luparia, вы могли бы сделать да - версионирование - это то, о чем ТАК нужно разобраться - вместо этого моды предпочли бы закрывать вопросы на весь день !! - person redsquare; 19.10.2012

Если вам нужно получить индекс вкладки вне контекста события вкладок, используйте это:

function getSelectedTabIndex() { 
    return $("#TabList").tabs('option', 'selected');
}

Обновление: с версии 1.9 «выбранный» изменен на «активный».

$("#TabList").tabs('option', 'active')
person Contra    schedule 26.08.2009
comment
Во всяком случае, это оказалось то, что мне нужно. - person El Yobo; 10.04.2010
comment
Похоже, это фактически дает вкладку по умолчанию, а не текущую выбранную вкладку. Что мне не хватает? 42 голоса не могут ошибаться, не так ли? jqueryui.com/demos/tabs/#option-selected - person Patrick Szalapski; 10.12.2011
comment
Да, это решение помогло. Спасибо @Contra - person Ashwin; 09.08.2012
comment
Параметр «selected» был переименован в «активный» в jQuery UI версии 1.9 (см. jqueryui.com/changelog /1.9.0) - person jake; 21.10.2012

ОБНОВЛЕНИЕ [Вс, 26.08.2012] Этот ответ стал настолько популярным, что я решил превратить его в полноценный блог / руководство
Пожалуйста, посетите Мой блог здесь, чтобы увидеть последние новости в удобном доступе информация для работы с вкладками в jQueryUI
Также включен (тоже в блог) jsFiddle


Обновлять! Обратите внимание: в более новых версиях jQueryUI (1.9+) ui-tabs-selected был заменен на ui-tabs-active. !!!


Я знаю, что эта ветка устарела, но кое-что, о чем я не упомянул, было то, как получить "выбранную вкладку" (текущая выпадающая панель) откуда-то, кроме " вкладка событий ". У меня есть простой способ ...

var curTab = $('.ui-tabs-panel:not(.ui-tabs-hide)');

И, чтобы легко получить индекс, конечно, есть способ, указанный на сайте ...

var $tabs = $('#example').tabs();
var selected = $tabs.tabs('option', 'selected'); // => 0

Однако вы можете использовать мой первый метод, чтобы получить индекс и все, что вы хотите об этой панели, довольно легко ...

var curTab = $('.ui-tabs-panel:not(.ui-tabs-hide)'),
    curTabIndex = curTab.index(),
    curTabID = curTab.prop("id"),
    curTabCls = curTab.attr("class");
        //  etc ....

PS. Если вы используете переменную iframe, а затем .find ('. Ui-tabs-panel: not (.ui-tabs-hide)'), вам будет легко сделать это и для выбранных вкладок во фреймах. Помните, jQuery уже проделал всю тяжелую работу, не нужно изобретать велосипед!

Просто чтобы расширить (обновлено)

Мне был задан вопрос: «Что делать, если в представлении есть более одной области вкладок?» Опять же, просто подумайте, используйте ту же настройку, но используйте идентификатор, чтобы определить, какие вкладки вы хотите получить.

Например, если у вас есть:

$('#example-1').tabs();
$('#example-2').tabs();

И вы хотите, чтобы текущая панель второй вкладки была установлена:

var curTabPanel = $('#example-2 .ui-tabs-panel:not(.ui-tabs-hide)');

И если вам нужна вкладка ФАКТИЧЕСКАЯ, а не панель (очень просто, поэтому я не упоминал об этом раньше, но полагаю, что сделаю это сейчас, просто для тщательности)

// for page with only one set of tabs
var curTab = $('.ui-tabs-selected'); // '.ui-tabs-active' in jQuery 1.9+

// for page with multiple sets of tabs
var curTab2 = $('#example-2 .ui-tabs-selected'); // '.ui-tabs-active' in jQuery 1.9+

Опять же, помните, jQuery проделал всю тяжелую работу, не думайте так усердно.

person SpYk3HH    schedule 01.11.2011
comment
Отлично, спасибо! Если хотите, можете предоставить это как ответ на stackoverflow.com/q/1864219/11992. - person nikow; 22.11.2011
comment
Это именно то, что мне было нужно - спасибо! - person Justin Ethier; 22.12.2011
comment
Параметр «выбранный» был переименован в «активный» в jQuery UI версии 1.9 (см. Jqueryui.com/changelog/1.9.0). - person jake; 21.10.2012

Если вы используете JQuery UI версии 1.9.0 или выше, вы можете получить доступ к ui.newTab.index () внутри своей функции и получить то, что вам нужно.

Для более ранних версий используйте ui.index.

person Giorgio Luparia    schedule 19.10.2012
comment
Было бы здорово, если бы вы могли дополнить свой ответ некоторыми дополнительными деталями. - person Sledge; 06.10.2017

Когда вы пытаетесь получить доступ к объекту пользовательского интерфейса? ui будет неопределенным, если вы попытаетесь получить к нему доступ вне события привязки. Кроме того, если эта строка

var selectedTab = $("#TabList").tabs().data("selected.tabs");

запускается в таком случае:

$("#TabList").bind("tabsselect", function(event, ui) {
  var selectedTab = $("#TabList").tabs().data("selected.tabs");
});

selectedTab будет соответствовать текущей вкладке в этот момент времени («предыдущей»). Это связано с тем, что событие «tabsselect» вызывается до того, как выбранная вкладка становится текущей вкладкой. Если вы по-прежнему хотите сделать это таким образом, использование вместо этого tabsshow приведет к тому, что selectedTab будет соответствовать нажатой вкладке.

Однако это кажется слишком сложным, если все, что вам нужно, - это индекс. ui.index из события или $ ("# TabList"). tabs (). data ("selected.tabs") вне события должно быть всем, что вам нужно.

person Ben Koehler    schedule 19.11.2008
comment
@Ben: ваше решение дает предыдущую выбранную вкладку, поскольку это был индекс, когда было запущено событие tabsselect. - person Michael Mao; 20.02.2010
comment
@Michael: Вы прочитали мой ответ или просто взяли код? В своем ответе я заявляю, что код не будет работать как есть, и предлагаю несколько альтернатив (событие 'tabshow'; ui.index; $ ('TabList'). Tabs (). Data ('selected.tabs')) - person Ben Koehler; 21.02.2010
comment
: Извините за мой поздний ответ. Да, ui.index работает нормально. Я просто хотел отметить тот факт, что selected.tabs отображает предыдущую выбранную вкладку, а не лечебную. Я не хочу обидеть твой ответ. - person Michael Mao; 24.02.2010

это изменилось с версией 1.9

что-то типа

 $(document).ready(function () {
            $('#tabs').tabs({
                activate: function (event, ui) {
                    var act = $("#tabs").tabs("option", "active");
                    $("#<%= hidLastTab.ClientID %>").val(act);
                    //console.log($(ui.newTab));
                    //console.log($(ui.oldTab));
                }
            });

            if ($("#<%= hidLastTab.ClientID %>").val() != "") 
            {
                $("#tabs").tabs("option", "active", $("#<%= hidLastTab.ClientID %>").val());
            }


        });

должен быть использован. У меня это отлично работает ;-)

person user1714346    schedule 08.02.2013

Если кто-то пытался получить доступ к вкладкам из iframe, вы можете заметить, что это невозможно. div вкладки никогда не помечается как выбранный, он просто скрыт или не скрыт. Сама ссылка - единственный фрагмент, отмеченный как выбранный.

<li class="ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-focus"><a href="#tabs-4">Tab 5</a></li>

Следующее даст вам href значение ссылки, которое должно совпадать с идентификатором вашего контейнера вкладок:

jQuery('.ui-tabs-selected a',window.parent.document).attr('href')

Это также должно работать вместо: $tabs.tabs('option', 'selected');

Это лучше в том смысле, что вместо того, чтобы просто получить индекс вкладки, он дает вам фактический идентификатор вкладки.

person Lance    schedule 20.04.2011

самый простой способ сделать это

$("#tabs div[aria-hidden='false']");

и для индекса

$("#tabs div[aria-hidden='false']").index();
person Vishal Sharma    schedule 03.04.2013

В случае, если вы найдете Активную вкладку Индекс, а затем наведите указатель на Активную вкладку

Сначала получите активный индекс

var activeIndex = $("#panel").tabs('option', 'active');

Затем с помощью класса css получите панель содержимого вкладки

// this will return the html element
var element=   $("#panel").find( ".ui-tabs-panel" )[activeIndex]; 

теперь обернул его в объект jQuery для дальнейшего использования

 var tabContent$ = $(element);

здесь я хочу добавить две информации, с которыми связан класс .ui-tabs-nav для навигации, а .ui-tabs-panel связан с панелью содержимого вкладок. в этой демонстрационной ссылке на веб-сайте jquery ui вы увидите, что этот класс используется - http://jqueryui.com/tabs/#manipulation

person dekdev    schedule 11.07.2013

$( "#tabs" ).tabs( "option", "active" )

тогда у вас будет индекс вкладки от 0

просто

person Qin Wang    schedule 21.03.2013

Попробуйте следующее:

var $tabs = $('#tabs-menu').tabs();

var selected = $tabs.tabs('option', 'selected');

var divAssocAtual = $('#tabs-menu ul li').tabs()[selected].hash;
person Fabio    schedule 05.03.2012

Я обнаружил, что приведенный ниже код помогает. Устанавливает переменную индекса новой выбранной вкладки

$("#tabs").tabs({
    activate: function (e, ui) {
        currentTabIndex =ui.newTab.index().toString();
    }
});
person Brian M    schedule 09.09.2013

Вы можете опубликовать ответ ниже в своем следующем сообщении

var selectedTabIndex= $("#tabs").tabs('option', 'active');
person Mike Clark    schedule 29.09.2015
comment
Этот ответ полезен для поиска текущей активной вкладки, особенно когда не в контексте события выбора вкладки. - person hrabinowitz; 02.11.2015

Другой способ получить индекс выбранной вкладки:

var index = jQuery('#tabs').data('tabs').options.selected;
person chrism    schedule 26.10.2011

$("#tabs").tabs({  
    load:  function(event, ui){  
        var anchor = ui.tab.find(".ui-tabs-anchor");  
        var url = anchor.attr('href');  
    }  
});  

В переменной url вы получите HREF / URL текущей вкладки.

person Chandre Gowda    schedule 19.04.2013

Вы можете найти его через:

$(yourEl).tabs({
    activate: function(event, ui) {
        console.log(ui.newPanel.index());
    }
});
person Pertr Pavliuk    schedule 20.05.2020

возьмите скрытую переменную, например '<input type="hidden" id="sel_tab" name="sel_tab" value="" />', и на каждой вкладке события onclick напишите код, например ...

<li><a href="#tabs-0" onclick="document.getElementById('sel_tab').value=0;" >TAB -1</a></li>
<li><a href="#tabs-1" onclick="document.getElementById('sel_tab').value=1;" >TAB -2</a></li>

вы можете получить значение 'sel_tab' на опубликованной странице. :) , просто !!!

person Paresh    schedule 10.12.2010
comment
Я не голосовал против, но нет причин для дополнительной разметки и встроенного JavaScript. Тем более, что он уже использует jQuery ... - person Justin Ethier; 22.12.2011

Если вы хотите, чтобы ui.newTab.index() был доступен во всех ситуациях (локальные и удаленные вкладки), вызовите его в функции активировать как документация говорит:

$("#tabs").tabs({
        activate: function(event, ui){
             alert(ui.newTab.index());
             // You can also use this to set another tab, see fiddle...
             // $("#other-tabs").tabs("option", "active", ui.newTab.index());                   
        },
});

http://jsfiddle.net/7v7n0v3j/

person prograhammer    schedule 30.09.2014

person    schedule
comment
Добро пожаловать в Stack Overflow! Хотя ссылки - отличный способ обмена знаниями, они не ответят на вопрос, если в будущем они будут сломаны. Добавьте к своему ответу основное содержание ссылки, которая отвечает на вопрос. Если содержание слишком сложное или слишком большое, чтобы уместиться здесь, опишите общую идею предлагаемого решения. Не забывайте всегда сохранять ссылку на веб-сайт исходного решения. См .: Как написать хороший ответ? - person sɐunıɔןɐqɐp; 05.08.2018