jQuery UI Tabs - Como obter o índice das guias selecionadas no momento


112

Eu sei que essa pergunta específica já foi feita antes , mas não estou obtendo nenhum resultado usando o bind()evento no jQuery UI Tabsplugin.

Eu só preciso da indexguia recém-selecionada para executar uma ação quando a guia for clicada. bind()permite que eu me conecte ao evento select, mas meu método usual de obter a guia atualmente selecionada não funciona. Ele retorna o índice da guia selecionada anteriormente, não o novo:

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

Aqui está o código que estou tentando usar para obter a guia atualmente selecionada:

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

});

Quando eu uso esse código, o objeto ui voltaundefined . Pela documentação, este deve ser o objeto que estou usando para conectar ao índice recém-selecionado usando ui.tab. Eu tentei isso na tabs()ligação inicial e também por conta própria. Estou fazendo algo errado aqui?

Respostas:


71

Para versões JQuery UI anteriores a 1.9 : ui.indexdo eventé o que você deseja.

Para JQuery UI 1.9 ou posterior : veja a resposta de Giorgio Luparia, abaixo.


Muito boa resposta! Incluí um resumo do que você fez no site apenas para facilitar a obtenção de uma resposta.
torial de

Saúde, o Q mencionou que o objeto ui era nulo, portanto, ui.index falhará no momento. Acho que a resposta talvez não seja tão simples quanto incluir isso.
redsquare

Esta foi uma resposta perfeita e obrigado pelo exemplo incrível! Eu estava tentando fazer tudo de uma vez, mas não estava funcionando. Depois de dividir tudo, tudo funcionou como anunciado.
Mark Struzinski

4
A resposta está aí - use a propriedade ui.index para obter o índice atual no evento tabselect .....
redsquare

17
A resposta deve ser atualizada porque não está funcionando com o JQuery UI 1.9.0. Você deve alterar ui.index com ui.newTab.index () de acordo com o Guia de atualização ( jqueryui.com/upgrade-guide/1.9/… )
Giorgio Luparia

201

Se você precisar obter o índice de tabulação de fora do contexto de um evento tabs, use isto:

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

Atualização: A partir da versão 1.9 'selecionado' é alterado para 'ativo'

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

2
Isso parecia ser o que eu precisava, de qualquer maneira.
El Yobo,

2
Parece que isso realmente fornece a guia padrão, não a guia atualmente selecionada. o que estou perdendo? 42 votos não podem estar errados, podem? jqueryui.com/demos/tabs/#option-selected
Patrick Szalapski

Sim, esta solução ajudou. Obrigado @Contra
Ashwin

9
A opção 'selecionada' foi renomeada para 'ativa' no jQuery UI versão 1.9 (consulte jqueryui.com/changelog/1.9.0 )
jake

43

ATUALIZAÇÃO [ Sun 2012/08/26 ] Esta resposta tornou-se tão popular que eu decidi fazê-lo em um blog de pleno direito / tutorial
Visite meu blog aqui para ver o mais recente em informações de acesso fácil de trabalhar com abas em jQueryUI
Também incluídos (no blog também) é um jsFiddle


¡¡¡Atualização! Observação: nas versões mais recentes do jQueryUI (1.9+), ui-tabs-selectedfoi substituído por ui-tabs-active. !!!


Eu sei que este tópico é antigo, mas algo que não vi mencionado foi como obter a "guia selecionada" (painel atualmente suspenso) de algum lugar diferente dos "eventos da guia". Eu tenho uma maneira simples ...

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

E para obter facilmente o índice, claro que existe a forma listada no site ...

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

No entanto, você poderia usar meu primeiro método para obter o índice e qualquer coisa que quiser sobre esse painel muito fácil ...

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

PS. Se você usar uma variável iframe então .find ('. Ui-tabs-panel: not (.ui-tabs-hide)'), você achará fácil fazer isso também para as guias selecionadas nos quadros. Lembre-se, jQuery já fez todo o trabalho duro, não há necessidade de reinventar a roda!

Apenas para expandir (atualizado)

A pergunta que me foi apresentada: "E se houver mais de uma área de guias na visualização?" Novamente, pense de forma simples, use minha mesma configuração, mas use um ID para identificar quais guias você deseja acessar.

Por exemplo, se você tem:

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

E você quer o painel atual do segundo conjunto de guias:

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

E se você quiser a guia ACTUAL e não o painel (muito fácil, é por isso que eu não mencionei antes, mas suponho que vou agora, apenas para ser mais completo)

// 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+

Novamente, lembre-se, jQuery fez todo o trabalho duro, não pense muito.


Excelente, obrigado! Se desejar, você também pode fornecer uma resposta para stackoverflow.com/q/1864219/11992 .
nikow

Isso é exatamente o que eu precisava - Obrigado!
Justin Ethier

5
A opção 'selecionada' foi renomeada para 'ativa' no jQuery UI versão 1.9 (consulte jqueryui.com/changelog/1.9.0).
jake

41

Se estiver usando JQuery UI versão 1.9.0 ou superior, você pode acessar ui.newTab.index () dentro de sua função e obter o que precisa.

Para versões anteriores, use ui.index .


6
Seria ótimo se você pudesse dar mais detalhes à sua resposta.
Trenó,

12
var $tabs = $('#tabs-menu').tabs();
// jquery ui 1.8
var selected = $tabs.tabs('option', 'selected');
// jquery ui 1.9+
var active = $tabs.tabs('option', 'active');

11

Quando você está tentando acessar o objeto IU? ui será indefinido se você tentar acessá-lo fora do evento de ligação. Além disso, se esta linha

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

é executado no evento assim:

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

selectedTab será igual à guia atual naquele ponto no tempo (a "anterior".) Isso ocorre porque o evento "tabsselect" é chamado antes que a guia clicada se torne a guia atual. Se você ainda quiser fazer dessa forma, usar "tabsshow" resultará em selectedTab igualando-se à guia clicada.

No entanto, isso parece muito complexo se tudo o que você deseja é o índice. ui.index de dentro do evento ou $ ("# TabList"). tabs (). data ("selected.tabs") fora do evento deve ser tudo o que você precisa.


@Ben: sua solução fornece a guia selecionada anteriormente, pois era o índice quando o evento tabsselect foi acionado.
Michael Mao

1
@Michael: Você leu minha resposta ou apenas pegou o código? Em minha resposta, afirmo que o código não funcionará como está e forneço algumas alternativas (evento 'tabshow'; ui.index; $ ('TabList'). Tabs (). Data ('selected.tabs'))
Ben Koehler

: Desculpe pela minha resposta tardia. Sim, o ui.index funciona bem. Eu só queria apontar o fato de que selected.tabs fornece a guia selecionada "anterior", não a que contém a cura. Não quero ofender sua resposta.
Michael Mao

5

isso mudou com a versão 1.9

algo como

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


        });

deve ser usado. Isso está funcionando bem para mim ;-)


4

Caso alguém tenha tentado acessar as guias de um iframe, você perceberá que não é possível. O divda guia nunca é marcado como selecionado, apenas como oculto ou não oculto. O link em si é a única peça marcada como selecionada.

<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>

A seguir, você obterá o hrefvalor do link, que deve ser igual ao id do contêiner da guia:

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

Isso também deve funcionar no lugar de: $tabs.tabs('option', 'selected');

É melhor no sentido de que em vez de apenas obter o índice da guia, ele fornece a id real da guia.


4

a maneira mais fácil de fazer isso é

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

e para índice

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

4

Caso você encontre Índice da guia Ativa e aponte para Guia Ativa

Primeiro obtenha o índice ativo

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

Então, usando a classe css, obtenha o painel de conteúdo da guia

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

agora embrulhado em objeto jQuery para usá-lo posteriormente

 var tabContent$ = $(element);

aqui eu quero adicionar duas informações de que a classe .ui-tabs-navé para Navegação associada e .ui-tabs-panelestá associada ao painel de conteúdo da guia. neste link demo no site jquery ui você verá que esta classe é usada - http://jqueryui.com/tabs/#manipulation


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

então você terá o índice da guia de 0

simples


2

Experimente o seguinte:

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

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

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

2

Eu descobri que o código abaixo faz o truque. Define uma variável do índice da guia recém-selecionada

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

2

Você pode postar a resposta abaixo em sua próxima postagem

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

Essa resposta é útil para localizar a guia ativa atual, principalmente quando não está no contexto de um evento de seleção de guia.
hrabinowitz

1

Outra maneira de obter o índice da guia selecionada é:

var index = jQuery('#tabs').data('tabs').options.selected;

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

Na variável url você obterá o HREF / URL da guia atual


1

Você pode encontrá-lo via:

$(yourEl).tabs({
    activate: function(event, ui) {
        console.log(ui.newPanel.index());
    }
});

0

pegue uma variável oculta como '<input type="hidden" id="sel_tab" name="sel_tab" value="" />'e em cada evento onclick da guia escreva o código como ...

<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>

você pode obter o valor de 'sel_tab' na página postada. :), simples !!!


2
Eu não votei em você, mas não há razão para a marcação extra e o JavaScript embutido. Especialmente porque ele já está usando jQuery ...
Justin Ethier

0

Se você quiser garantir que ui.newTab.index()está disponível em todas as situações (guias locais e remotas), chame-o na função ativar como diz a documentação :

$("#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/


0
$("#tabs").tabs({
    activate: function(event, ui) {
        new_index = ui.newTab.index()+1;
        //do anything
    }
});

1
Bem-vindo ao Stack Overflow! Embora os links sejam uma ótima maneira de compartilhar conhecimento, eles não responderão realmente à pergunta se forem quebrados no futuro. Adicione à sua resposta o conteúdo essencial do link que responde à pergunta. Caso o conteúdo seja muito complexo ou grande para caber aqui, descreva a ideia geral da solução proposta. Lembre-se de manter sempre um link de referência para o site da solução original. Veja: Como escrevo uma boa resposta?
sɐunıɔ ןɐ qɐp
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.