118 votes

Onglets jQuery UI - Comment obtenir l'index de l'onglet actuellement sélectionné ?

Je sais que cette question spécifique a été demandé avant mais je n'obtiens aucun résultat en utilisant l'option bind() sur l'événement jQuery UI Tabs plugin.

J'ai juste besoin du index de l'onglet nouvellement sélectionné pour effectuer une action lorsque l'on clique sur l'onglet. bind() me permet d'accéder à l'événement select, mais ma méthode habituelle pour obtenir l'onglet actuellement sélectionné ne fonctionne pas. Elle renvoie l'index de l'onglet précédemment sélectionné, et non le nouvel onglet :

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

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

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

});

Quand j'utilise ce code, l'objet ui revient undefined . D'après la documentation, il s'agit de l'objet que je dois utiliser pour accéder à l'index nouvellement sélectionné en utilisant ui.tab. J'ai essayé de le faire sur la page initiale tabs() l'appel et aussi par lui-même. Est-ce que je fais quelque chose de mal ici ?

206voto

Contra Points 1996

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

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

Mise à jour : A partir de la version 1.9, "selected" est remplacé par "active".

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

2 votes

Cela semblait être ce dont j'avais besoin, de toute façon.

2 votes

Il semble que cela donne en fait l'onglet par défaut, et non l'onglet actuellement sélectionné. Qu'est-ce que j'ai raté ? 42 votes ne peuvent pas être faux, n'est-ce pas ? jqueryui.com/demos/tabs/#option-selected

0 votes

Oui, cette solution m'a aidé. Merci @Contra

74voto

redsquare Points 47518

Pour les versions de JQuery UI antérieures à 1.9 : ui.index de la event est ce que vous voulez.

Pour JQuery UI 1.9 ou supérieur : voir le réponse par Giorgio Luparia, ci-dessous.

0 votes

Très belle réponse ! J'ai inclus un résumé de ce que vous avez fait dans le site Web afin de faciliter l'obtention de la réponse.

0 votes

Merci, la question mentionnait 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 d'inclure cela.

0 votes

C'était une réponse parfaite, et merci pour l'exemple génial ! J'essayais de tout faire en une seule fois, et ça ne marchait pas. Après l'avoir divisé, tout a fonctionné comme prévu.

45voto

Giorgio Luparia Points 426

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

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

6 votes

Ce serait formidable si vous pouviez étoffer votre réponse avec quelques détails supplémentaires.

43voto

SpYk3HH Points 10533

UPDATE [ Dimanche 26/08/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 le dernier cri en matière d'information facile d'accès pour travailler avec onglets dans jQueryUI
Vous trouverez également (dans le blog également) une jsFiddle


¡¡¡ Mise à jour ! Veuillez noter : Dans les versions plus récentes de jQueryUI (1.9+), ui-tabs-selected a été remplacé par ui-tabs-active . ! !!


Je sais que ce fil est vieux, mais Une chose que je n'ai pas vue mentionnée est comment obtenir l'"onglet sélectionné" (panneau déroulant actuel) à partir d'un autre endroit que les "événements d'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 puis .find('.ui-tabs-panel:not(.ui-tabs-hide)'), vous trouverez qu'il est facile de faire cela pour les onglets sélectionnés dans les cadres également. N'oubliez pas que jQuery a déjà fait tout le travail, pas besoin de réinventer la roue !

Juste pour développer (mis à jour)

On m'a posé la question suivante : "Que se passe-t-il s'il y a plus d'une zone d'onglets dans la vue ?". Encore une fois, pensez simplement, utilisez ma même configuration mais utilisez un ID pour identifier les onglets que vous voulez atteindre.

Par exemple, si vous avez :

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

Et vous voulez que le panneau actuel du deuxième onglet soit défini :

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

Et si vous voulez l'onglet RÉEL et non le panneau (vraiment facile, c'est pourquoi je ne l'ai pas mentionné avant mais je suppose que je vais le faire 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, n'oubliez pas que c'est jQuery qui a fait tout le travail, ne pensez pas trop fort.

0 votes

Excellent, merci ! Si vous le souhaitez, vous pouvez également fournir cette réponse à la question suivante stackoverflow.com/q/1864219/11992 .

0 votes

C'est exactement ce dont j'avais besoin - Merci !

5 votes

L'option "selected" a été renommée "active" dans la version 1.9 de jQuery UI (voir jqueryui.com/changelog/1.9.0).

12voto

Ben Koehler Points 4707

Quand essayez-vous d'accéder à l'objet ui ? L'objet ui sera indéfini si vous essayez d'y accéder en dehors de l'événement bind. De même, si cette ligne

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

est exécuté dans l'événement comme ceci :

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

selectedTab sera égal à l'onglet actuel à ce moment-là (l'onglet "précédent"), car l'événement "tabsselect" est appelé avant que l'onglet cliqué ne devienne l'onglet actuel. Si vous souhaitez toujours procéder de cette manière, l'utilisation de "tabsshow" à la place aura pour résultat que selectedTab sera égal à l'onglet cliqué.

Cependant, cela semble trop complexe si tout ce que vous voulez est l'index. ui.index à l'intérieur de l'événement ou $("#TabList").tabs().data("selected.tabs") à l'extérieur de l'événement devraient suffire.

0 votes

@Ben : votre solution donne le précédent onglet sélectionné car c'était l'index lorsque l'événement tabsselect a été déclenché.

1 votes

@Michael : Avez-vous lu ma réponse ou avez-vous simplement saisi le code ? Dans ma réponse, j'indique que le code ne fonctionnera pas tel quel et je propose quelques alternatives ('tabshow' event ; ui.index ; $('TabList').tabs().data('selected.tabs')).

0 votes

Désolé pour ma réponse tardive. Oui, le ui.index fonctionne très bien. Je voulais juste souligner le fait que selected.tabs donne l'onglet sélectionné "précédent", et non celui qui est en cours de traitement. Je ne veux pas offenser votre réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X