55 votes

Se souvenir de l'onglet actif après un rafraîchissement

J'utilise des onglets jquery sur une page web et lorsque la page est rafraîchie, elle perd l'onglet sur lequel j'étais et revient au premier onglet.

Quelqu'un a-t-il rencontré ce problème et sait-il comment le résoudre ?

0 votes

Les cookies sont vos amis.

39voto

Arik Points 231

Comme d'autres, j'ai eu des difficultés avec l'historique des cookies de mes ui-tabs dans jQueryUI 1.10. Grâce à la solution de Harry et à d'autres documents en ligne auxquels je fais référence dans le code ci-dessous, j'ai maintenant une solution fonctionnelle sans cookie ! J'ai pu la tester dans Firefox 18.0.1 et IE 9.0.12. D'après mes ressources, Chrome, Firefox, Safari et IE8 et supérieur prennent en charge le stockage de session.

  $(function() {
    //  jQueryUI 1.10 and HTML5 ready
    //      http://jqueryui.com/upgrade-guide/1.10/#removed-cookie-option 
    //  Documentation
    //      http://api.jqueryui.com/tabs/#option-active
    //      http://api.jqueryui.com/tabs/#event-activate
    //      http://balaarjunan.wordpress.com/2010/11/10/html5-session-storage-key-things-to-consider/
    //
    //  Define friendly index name
    var index = 'key';
    //  Define friendly data store name
    var dataStore = window.sessionStorage;
    //  Start magic!
    try {
        // getter: Fetch previous value
        var oldIndex = dataStore.getItem(index);
    } catch(e) {
        // getter: Always default to first tab in error state
        var oldIndex = 0;
    }
    $('#tabs').tabs({
        // The zero-based index of the panel that is active (open)
        active : oldIndex,
        // Triggered after a tab has been activated
        activate : function( event, ui ){
            //  Get future value
            var newIndex = ui.newTab.parent().children().index(ui.newTab);
            //  Set future value
            dataStore.setItem( index, newIndex ) 
        }
    }); 
    });

1 votes

C'est de loin la meilleure méthode, et je voulais juste faire remarquer quelque chose aux nouveaux utilisateurs de Jquery : la ligne '$(function() {' est la même que la ligne '$(document).ready(function () {', et cela signifie que le code que vous avez fourni est exécuté à chaque fois que la page entre, mais APRÈS que le DOM soit complètement chargé.

0 votes

Joli ! Fonctionne avec jquery ui 1.8.20.

0 votes

Fonctionne encore mieux avec store.js de marcuswestin : github.com/marcuswestin/store.js

21voto

tawfekov Points 4061

Je suppose que vous utilisez les onglets jQuery UI ,

voici un exemple d'utilisation des onglets + cookies pour sauvegarder le dernier onglet cliqué

http://jqueryui.com/demos/tabs/#cookie

démo : ouvrir ce lien http://jqueryui.com/demos/tabs/cookie.html

fermez-le et ouvrez-le à nouveau et vous verrez le même onglet cliqué.

mettre à jour : après 3 ans de cette réponse, l'interface utilisateur de jquery a déprécié l'option cookie : http://jqueryui.com/upgrade-guide/1.9/#deprecated-cookie-option .

mais vous pouvez toujours ajouter des annexes, regardez ici si cela correspond à vos besoins ou non. https://stackoverflow.com/a/14313315/109217

3 votes

jqueryui.com/demos/tabs/cookie.html Le lien est cassé. Je pense que l'autre lien ne montre plus ce que vous voulez. Peut-être que je me trompe... ?

0 votes

@RickSmith cette réponse date de 3 ans, de toute façon je vais la mettre à jour maintenant.

3 votes

@tawfekov Et c'est toujours un lien-réponse.

11voto

Hatcham Points 190

Je viens de mettre en place une alternative plus simple :

$(".tabs").tabs({
    select: function(event, ui) {                   
       window.location.replace(ui.tab.hash);
    },
});

Cela ajoutera la valeur de hachage à l'url de sorte qu'un rafraîchissement de la page rechargera l'onglet en question. location.replace plutôt que location.hash nous ne remplissons pas l'historique de l'utilisateur avec des retours en arrière non désirés.

J'espère que cela vous aidera.

2 votes

Votre méthode est excellente, mais elle recharge la page. window.location.hash = ui.tab.hash ; fait le même travail sans recharger la page.

3 votes

Cette méthode ne fonctionne pas. Elle ne fait rien du tout. Elle ne remplace aucune partie de l'URL et n'impose pas l'onglet actif lors du rechargement de la page.

5voto

Harry Points 1143

Maintenant que le cookie a disparu dans jQuery UI 1.10.0, j'ai mélangé l'approche de Gayathiri avec les nouvelles options et événements :

// using cookie plugin from https://github.com/carhartl/jquery-cookie

var tabCookieName = "ui-tabs-1";
$(".tabs").tabs({
    active : ($.cookie(tabCookieName) || 0);
    activate : function( event, ui ) {
        var newIndex = ui.newTab.parent().children().index(ui.newTab);
        // my setup requires the custom path, yours may not
        $.cookie(tabCookieName, newIndex, { path: window.location.pathname });
    }
});

0 votes

Ceci semble être la meilleure solution si vous utilisez la version 1.10+.

0 votes

Cela a très bien fonctionné lorsque le "chemin" a été supprimé pour ma solution, comme le suggère le commentaire ci-dessus.

2voto

Orbling Points 13319

Lorsque les pages web se rafraîchissent, elles rechargent leur état depuis le serveur, en demandant à nouveau la page.

Soit le serveur Web doit se souvenir de l'état et fournir le fichier différemment de la valeur par défaut, soit vous pouvez utiliser des cookies ou la composante de hachage de l'URL et un peu de jQuery pour stocker l'état, le lire au chargement et le restaurer.

Voir le plugin jquery.cookie o SWFaddress , apprenez à manipuler vous-même les valeurs de hachage ou le plugin jQuery History.

La méthode du hachage présente un attrait particulier car elle reproduit les changements d'URL, de sorte que le copier/coller de l'URL fonctionne toujours, tout comme les signets.

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