Onglets de l'interface utilisateur jQuery - Comment obtenir l'index des onglets actuellement sélectionnés

112

Je sais que cette question spécifique a déjà été posée , mais je n'obtiens aucun résultat en utilisant l' bind()événement sur le jQuery UI Tabsplugin.

J'ai juste besoin indexde l'onglet nouvellement sélectionné pour effectuer une action lorsque l'utilisateur clique sur l'onglet. bind()me permet de m'accrocher à l'événement select, mais ma méthode habituelle pour obtenir l'onglet actuellement sélectionné ne fonctionne pas. Il renvoie l'index de l'onglet précédemment sélectionné, pas le nouveau:

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

Voici le code que j'essaie d'utiliser pour obtenir l'onglet actuellement sélectionné:

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

});

Lorsque j'utilise ce code, l'objet ui revientundefined . D'après la documentation, cela devrait être l'objet que j'utilise pour m'accrocher à l'index nouvellement sélectionné en utilisant ui.tab. J'ai essayé cela lors de l' tabs()appel initial et aussi seul. Est-ce que je fais quelque chose de mal ici?

Mark Struzinski
la source

Réponses:

71

Pour les versions de JQuery UI antérieures à la 1.9 : à ui.indexpartir de eventest ce que vous voulez.

Pour JQuery UI 1.9 ou version ultérieure : voir la réponse de Giorgio Luparia ci-dessous.

carré rouge
la source
Très belle réponse! J'ai inclus un résumé de ce que vous avez fait dans le site Web pour faciliter l'obtention de la réponse.
torial
Cheers, le Q a mentionné que l'objet ui était nul, donc ui.index échouera pour le moment. Je pense que la réponse n'est peut-être pas aussi simple que de l'inclure.
redsquare
C'était une réponse parfaite, et merci pour l'exemple génial! J'essayais de tout faire en un seul coup, et cela ne fonctionnait pas. Après l'avoir séparé, tout a fonctionné comme annoncé.
Mark Struzinski
4
La réponse est là - utilisez la propriété ui.index pour obtenir l'index actuel dans l'événement tabselect .....
redsquare
17
La réponse doit être mise à jour car elle ne fonctionne pas avec JQuery UI 1.9.0. Vous devriez changer ui.index avec ui.newTab.index () selon le Guide de mise à niveau ( jqueryui.com/upgrade-guide/1.9 / ... )
Giorgio Luparia
201

Si vous avez besoin d'obtenir l'index des onglets en dehors du contexte d'un événement tabs, utilisez ceci:

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

Mise à jour: à partir de la version 1.9, «sélectionné» est remplacé par «actif»

$("#TabList").tabs('option', 'active')
Contra
la source
2
Cela semblait être ce dont j'avais besoin, de toute façon.
El Yobo
2
On dirait que cela donne en fait l'onglet par défaut, pas l'onglet actuellement sélectionné. Qu'est-ce que je rate? 42 votes ne peuvent pas être faux, n'est-ce pas? jqueryui.com/demos/tabs/#option-selected
Patrick Szalapski
Ouais, cette solution a aidé. Merci @Contra
Ashwin
9
L'option 'selected' a été renommée en 'active' dans jQuery UI version 1.9 (voir jqueryui.com/changelog/1.9.0 )
jake
43

MISE À JOUR [ Sun 08/26/2012 ] Cette réponse est devenue si populaire que j'ai décidé d'en faire un blog / tutoriel à part entière.
Veuillez visiter Mon blog ici pour voir les dernières informations d'accès facile pour travailler avec les onglets dans jQueryUI
Également inclus (dans le blog aussi) est un jsFiddle


Mettre à jour! Remarque: dans les versions plus récentes de jQueryUI (1.9+), ui-tabs-selecteda été remplacé par ui-tabs-active. !!!


Je sais que ce fil est vieux, mais quelque chose que je n'ai pas vu mentionné était de savoir comment obtenir "l'onglet sélectionné" (panneau actuellement déroulé) à partir d'un autre endroit que les "événements de l'onglet". J'ai un moyen simple ...

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

Et pour obtenir facilement l'index, il y a bien sûr le chemin indiqué sur le site ...

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

Cependant, vous pouvez utiliser ma première méthode pour obtenir l'index et tout ce que vous voulez sur ce panneau assez facilement ...

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

PS. Si vous utilisez une variable iframe alors .find ('. Ui-tabs-panel: not (.ui-tabs-hide)'), vous trouverez également facile de le faire pour les onglets sélectionnés dans les cadres. Rappelez-vous que jQuery a déjà fait tout le travail, pas besoin de réinventer la roue!

Juste pour développer (mis à jour)

La question m'a été posée: "Que faire s'il y a plusieurs zones d'onglets sur la vue?" Encore une fois, pensez simple, utilisez ma même configuration, mais utilisez un identifiant pour identifier les onglets que vous souhaitez consulter.

Par exemple, si vous avez:

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

Et vous voulez le panneau actuel du deuxième ensemble d'onglets:

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

Et si vous voulez l'onglet ACTUAL et non le panneau (vraiment facile, c'est pourquoi je ne l'ai pas mentionné avant mais je suppose que je le ferai maintenant, juste pour être minutieux)

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

Encore une fois, rappelez-vous, jQuery a fait tout le travail difficile, ne réfléchissez pas si dur.

SpYk3HH
la source
Excellent, merci! Si vous le souhaitez, vous pouvez également fournir cette réponse à stackoverflow.com/q/1864219/11992 .
nikow
C'est exactement ce dont j'avais besoin - Merci!
Justin Ethier
5
L'option 'selected' a été renommée en 'active' dans jQuery UI version 1.9 (voir jqueryui.com/changelog/1.9.0).
jake
41

Si vous utilisez JQuery UI version 1.9.0 ou supérieure, vous pouvez accéder à ui.newTab.index () dans votre fonction et obtenir ce dont vous avez besoin.

Pour les versions antérieures, utilisez ui.index .

Giorgio Luparia
la source
6
Ce serait formidable si vous pouviez étoffer votre réponse avec quelques détails supplémentaires.
Luge
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');
MeneerBij
la source
11

Quand essayez-vous d'accéder à l'objet ui? ui ne sera pas défini si vous essayez d'y accéder en dehors de l'événement de liaison. Aussi, si cette ligne

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

est exécuté dans l'événement comme celui-ci:

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

selectedTab sera égal à l'onglet actuel à ce moment-là (le "précédent".) Cela est dû au fait que l'événement "tabsselect" est appelé avant que l'onglet cliqué ne devienne l'onglet actuel. Si vous voulez toujours le faire de cette façon, utiliser à la place "tabsshow" entraînera selectedTab égal à l'onglet cliqué.

Cependant, cela semble trop complexe si vous ne voulez que l'index. ui.index depuis l'événement ou $ ("# TabList"). tabs (). data ("selected.tabs") en dehors de l'événement devrait être tout ce dont vous avez besoin.

Ben Koehler
la source
@Ben: votre solution donne l'onglet sélectionné précédemment car c'était l'index lorsque l'événement tabsselect a été déclenché.
Michael Mao
1
@Michael: Avez-vous lu ma réponse ou simplement saisi le code? Dans ma réponse, j'affirme que le code ne fonctionnera pas tel quel et je propose quelques alternatives (événement 'tabshow'; ui.index; $ ('TabList'). Tabs (). Data ('selected.tabs'))
Ben Koehler
: Désolé pour ma réponse tardive. Ouais, ui.index fonctionne très bien. Je voulais juste souligner le fait que selected.tabs donne l'onglet "précédent" sélectionné, et non le curent. Je ne veux pas offenser votre réponse.
Michael Mao
5

cela a changé avec la version 1.9

quelque chose comme

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


        });

Devrait être utilisé. Cela fonctionne bien pour moi ;-)

user1714346
la source
4

Si quelqu'un a essayé d'accéder aux onglets à partir d'une iframe, vous remarquerez peut-être que ce n'est pas possible. Le divde l'onglet n'est jamais marqué comme sélectionné, juste comme caché ou non caché. Le lien lui-même est le seul élément marqué comme sélectionné.

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

Ce qui suit vous donnera la hrefvaleur du lien qui devrait être la même que l'ID de votre conteneur d'onglets:

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

Cela devrait également fonctionner à la place de: $tabs.tabs('option', 'selected');

C'est mieux en ce sens qu'au lieu d'obtenir simplement l'index de l'onglet, cela vous donne l'identifiant réel de l'onglet.

Lance
la source
4

le moyen le plus simple de procéder est

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

et pour index

$("#tabs div[aria-hidden='false']").index();
Vishal Sharma
la source
4

Dans le cas où vous trouvez l'index de l'onglet actif, puis pointez sur l'onglet actif

Obtenez d'abord l'index actif

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

Ensuite, à l'aide de la classe css, obtenez le panneau de contenu de l'onglet

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

maintenant enveloppé dans un objet jQuery pour l'utiliser davantage

 var tabContent$ = $(element);

ici, je veux ajouter deux informations auxquelles la classe .ui-tabs-navest pour la navigation associée et .ui-tabs-panelest associée au panneau de contenu de l'onglet. dans cette démo de lien dans le site Web de jquery ui, vous verrez que cette classe est utilisée - http://jqueryui.com/tabs/#manipulation

dekdev
la source
3
$( "#tabs" ).tabs( "option", "active" )

alors vous aurez l'index de tab de 0

Facile

Qin Wang
la source
2

Essayez ce qui suit:

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

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

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

J'ai trouvé que le code ci-dessous faisait l'affaire. Définit une variable de l'index de l'onglet nouvellement sélectionné

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

Vous pouvez poster la réponse ci-dessous dans votre prochain post

var selectedTabIndex= $("#tabs").tabs('option', 'active');
Mike Clark
la source
Cette réponse est utile pour trouver l'onglet actif actuel, en particulier lorsqu'elle n'est pas dans le contexte d'un événement de sélection d'onglet.
hrabinowitz
1

Une autre façon d'obtenir l'index de l'onglet sélectionné est:

var index = jQuery('#tabs').data('tabs').options.selected;
chrisme
la source
1
$("#tabs").tabs({  
    load:  function(event, ui){  
        var anchor = ui.tab.find(".ui-tabs-anchor");  
        var url = anchor.attr('href');  
    }  
});  

Dans la variable url , vous obtiendrez le HREF / URL de l'onglet actuel

Chandre Gowda
la source
1

Vous pouvez le trouver via:

$(yourEl).tabs({
    activate: function(event, ui) {
        console.log(ui.newPanel.index());
    }
});
Pertr Pavliuk
la source
0

prenez une variable cachée comme '<input type="hidden" id="sel_tab" name="sel_tab" value="" />'et sur l'événement onclick de chaque onglet, écrivez du code comme ...

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

vous pouvez obtenir la valeur de 'sel_tab' sur la page publiée. :) , Facile !!!

Paresh
la source
2
Je ne vous ai pas voté contre, mais il n'y a aucune raison pour le balisage supplémentaire et le JavaScript en ligne. D'autant qu'il utilise déjà jQuery ...
Justin Ethier
0

Si vous voulez vous assurer qu'il ui.newTab.index()est disponible dans toutes les situations (onglets locaux et distants), appelez-le dans la fonction d' activation comme le dit la documentation :

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

prograhammer
la source
0
$("#tabs").tabs({
    activate: function(event, ui) {
        new_index = ui.newTab.index()+1;
        //do anything
    }
});
iman64
la source
1
Bienvenue dans Stack Overflow! Bien que les liens soient un excellent moyen de partager des connaissances, ils ne répondront pas vraiment à la question s'ils sont rompus à l'avenir. Ajoutez à votre réponse le contenu essentiel du lien qui répond à la question. Au cas où le contenu serait trop complexe ou trop volumineux pour tenir ici, décrivez l'idée générale de la solution proposée. N'oubliez pas de toujours conserver un lien de référence vers le site Web de la solution d'origine. Voir: Comment rédiger une bonne réponse?
sɐunıɔ ןɐ qɐp