jQuery Tabs y registro en el historial

10/may/2010 5

Es muy común el uso de navegación de tipo tabs para contenidos dentro de una misma página y funcionan bastante bien; el usuario ya está acostumbrado a este tipo de elementos y los utiliza sin problemas, además que resulta liviano y relativamente fácil implementarlos.

Pero recientemente un cliente pidió que los tabs se pudieran navegar con el historial del browser, o sea que si vas seleccionado diferentes tabs e incluso saliendo a otras páginas, puedas volver a ellas con el botón ‘Back’ o ‘Volver’ del navegador, y volver a pasar por ellos. Esto me resultó en un problema no menor que me costó solucionar, ya que los tabs suelen reaccionar ante eventos del click del mouse (como por ejemplo para mostrar tal <div> al clickear tal enlace <a> y que a éste se le agregue una class="selected" que indique su estado de seleccionado). Y esto suelo no quedar registrado en el caché del browser para que pueda ser navegado como se pidió. Pero bueno, pude solucionarlo y aquí lo comparto por si lo necesitan; implica 2 pasos diferentes los cuales deben funcionar en conjunto:

Primero, crearemos una simple función en jQuery para que funcionen los tabs. Esta es una de las maneras más simples de crear este tipo de menúes. Para el HTML:

<div class="tabs"><!-- .tabs -->
   <ul id="menu_tabs">
      <li><a href="#item1">Item 1</a></li>
      ...
   </ul>
   <div id="item1" class="caja"><!-- #item1 -->
      <h2>Item 1</h2>
      <p>Donec gravida posuere arcu.</p>
   </div><!-- /#item1 -->
   ...
</div><!-- /.tabs -->

Le aplicamos la siguiente instrucción en jQuery:

$(function(){
   // definimos variables para el contenedor y los<div>'s de los tabs
   var tabContainers = $('.tabs > div');
   // creamos el evento click para cada uno de los items del menu de tabs
   $('div.tabs ul a').each(function() {
      $(this).click(function(){
         // guardamos el ancla (#item1 por ej.) en una variable del link clickeado
         var hash = $(this).attr('href');
         // escondemos todos los tabs
         tabContainers.hide();
         // mostramos el <div> que sea igual al ancla guardado
         $(hash).show();
         // jugamos agregando y quitando classes del menu
         $('div.tabs ul a').removeClass('selected');
         $('a[href='+hash+']').addClass('selected');
      });
   });
   // para comenzar, hacemos que el primer elemento sea el clickeado
   $('div.tabs ul a:first').click();
});

Ver demo tabs

CSSLab: btn back

Bien, con esto tienes tu menú de tabs funcionando de manera básica pero práctica. Ahora como notarás, al ir por los tabs y volver con el botón del navegador éstos no seguirán el mismo recorrido devuelta, aunque en la URL sí se vea que van cambiando. Para que esto ocurra, debemos comparar no el hash del enlace (<a href="#item1"> por ej.), sino comparar con la URL que va cambiando. Además se debe incluir el plugin jQuery BBQ, el que realiza el ingreso de la URL con tabs al caché del browser. Con el mismo HTML, miren la nueva función:

$(function(){
   var tabContainers = $('.tabs > div');
   // creamos un nuevo evento y lo incluimos al browser
   $(window).bind('hashchange', function () {
      // nuestra variable no la sacamos del <a> sino de la URL y dejamos el primero seleccionado
      var hash = window.location.hash || '#item1';
      // el resto es prácticamente lo mismo
      tabContainers.hide();
      $(hash).show();
      $('div.tabs ul a').removeClass('selected');
      $('a[href='+hash+']').addClass('selected');
   });
   // ejecutamos este nuevo evento 'hashchange' mediante un trigger
   $(window).trigger('hashchange');
});

Ver demo Tabs + History

En este ejemplo, incluso podemos abrir mediante la URL en el tab que queramos, por ejemplo con el siguiente link abriremos el demo en el tab 3:

Ver demo Tabs + History en el tercer tab

Comentarios

  1. Twitter Trackbacks for CSSLab - jQuery Tabs y registro en el historial [csslab.cl] on Topsy.com [#]

    […] CSSLab – jQuery Tabs y registro en el historial http://www.csslab.cl/2010/05/10/jquery-tabs-y-registro-en-el-historial – view page – cached Es muy común el uso de navegación de tipo tabs para contenidos dentro de una misma página y funcionan bastante bien; el usuario ya está acostumbrado a este tipo de elementos y los utiliza sin problemas, además que resulta liviano y relativamente fácil implementarlos. Tweets about this link Topsy.Data.Twitter.User[‘vargasmolina’] = {“photo”:”http://a3.twimg.com/profile_images/787922447/twitterProfilePhoto_normal.jpg”,”url”:”http://twitter.com/vargasmolina”,”nick”:”vargasmolina”}; vargasmolina: “RT @csslab: Nuevo articulo: jQuery Tabs y registro en el historial http://bit.ly/aJZLFP #csslab ” 43 minutes ago view tweet retweet Topsy.Data.Twitter.User[‘csslab’] = {“photo”:”http://a1.twimg.com/profile_images/421241744/Photo_1_normal.jpg”,”url”:”http://twitter.com/csslab”,”nick”:”csslab”}; csslab: “Nuevo articulo: jQuery Tabs y registro en el historial http://bit.ly/aJZLFP #csslab ” 4 hours ago view tweet retweet Filter tweets […]

  2. MAJESTIC12 [#]

    demo descargable pliiiiissssss

  3. Alex [#]

    buenisimo, gracias!

  4. Urbanchip [#]

    clap!, clap!, clap! como siempre….gracias totales!

  5. Alf_at_FFM [#]

    Gracias Jorge, esto era justo lo que estaba buscando.
    Magestic12: Puedes descargarte el código fuente de las demos.

Deja tu Comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

CSSLab