2009-02-20 37 views
47

He estado tratando de encontrar una manera de cambiar la ventana.location.hash a la pestaña actualmente seleccionada en Jquery UI Tabs.cambiar location.hash con jquery ui tabs

He intentado:

$("#tabs > ul").tabs(); 
$("#tabs > ul").bind("tabsshow", function(event, ui) { 
window.location.hash = ui.tab; 
}) 

Esto se traduce en el cambio de hash para #undefined cuando se cambia la pestaña.

También he intentado:

$("#tabs > ul").tabs({ 
select: function(event, ui) { 
window.location.hash = ui.tab } 
}); 

Pero esto no parece ser activado en absoluto.

Cualquier ayuda sería apreciada. Gracias.

Editar: Parece que parte de mi problema inicial tenía algo que ver con que js en algún otro lugar interfiriera con esto. Tanto la respuesta aceptada como la otra respuesta sugerida ligeramente modificada funcionan. Gracias a todos.

+0

¿Estás tratando de abrir un enlace en la pestaña en el enlace de clic ? –

+0

No, los enlaces que abro son parte de la página actual, no ajax/etc. – Rob

+0

esta es una demostración bastante impresionante de esta técnica: [http://jqueryfordesigners.com/jquery-tabs/](http://jqueryfordesigners.com/jquery-tabs/) –

Respuesta

49

En su función de controlador de eventos ui.tab es un elemento de anclaje. Puede recuperar su valor hash de la siguiente manera:

$("#tabs > ul").tabs(); 
$("#tabs > ul").bind("tabsshow", function(event, ui) { 
    window.location.hash = ui.tab.hash; 
}) 

¿Esto funciona para usted?

+1

Desafortunadamente no, recibo muchos errores ui.tab no definidos al cargar la página o al cambiar de pestaña. – Rob

+0

He estado intentando con la demostración que aparece en la página del documento y funciona bien con FF 3 e IE 7. ¿Está activando los eventos de forma manual? – Serxipc

+1

Intenté como sugirió con la página de demostración y su solución terminó funcionando, gracias por la solución, tendré que descubrir qué más en mi código fue detener su funcionamiento. Gracias – Rob

4

¿Sería esto lo que estás buscando?

$("#tabs > ul").tabs({ 
    select: function(event, ui) 
    { 
     window.location = "#" + ui.tab; 
    } 
}); 
+0

Intenté esto sin ninguna suerte. Incluso traté de poner una alerta antes de la configuración window.location y no aparece cuando cambio las pestañas. La única forma en que pude hacer que se activara fue vinculando tabsshow pero eso termina con un ui.tab no definido – Rob

+1

Cuando traté de usar el código de demostración, esta solución ligeramente modificada funcionó. El único cambio que sugeriría es hacerlo: window.location.hash = ui.tab.hash; – Rob

+1

Esto funcionó como la mejor solución para mí. Otras sugerencias dieron como resultado que la página saltara a la pestaña seleccionada cuando se actualizó el hash de ubicación. Seconding "window.location.hash = ui.tab.hash;" en lugar de lo que se proporciona en el ejemplo, tho. –

3
$('#tabs').tabs({ 
    select: function(event, ui){ 
     window.location = ui.tab.href; 
    } 
}); 
0

Parece que ui.tab en sí mismo no devuelve una cadena válida. (en cambio, devuelve indefinido, por lo que diría que no devuelve nada).

Intente buscar en la versión de desarrollo de ui.jquery.js si hay alguna devoluciones allí, tal vez tenga que llamar un niño de ui.tab ;-)

+0

@Fabdrol necesita ui.tab.index;) –

25
$('#tabs').tabs({ 
    select: function(event, ui) { 
     window.location.hash = ui.tab.hash; 
    } 
}); 
14

Mientras que algunas de las soluciones anteriores funciona, que hacen que la página se desplace en algunos casos, ya que la API window.location.hash está diseñada para llevarlo a una parte específica de la página.

Esta solución ordenada propuso here, resuelve ese problema

$("#tabs").bind("tabsshow", function(event, ui) { 
    history.pushState(null, null, ui.tab.hash); 
    }); 
+0

Esto probablemente debería marcarse como la respuesta correcta. – wblaschko

8

Esto funcionó para mí, jQuery UI 1.10:

$('#elexumaps_events_tabs').tabs({ 
    activate: function(event, ui) { 
     window.location.hash=ui.newPanel.selector; 
    } 
}); 

Ver también: http://api.jqueryui.com/tabs/#event-activate

+0

esto funciona bien para mí, sin embargo, estoy usando ajax para cargar mis pestañas, por lo que el hash siempre es "ui-tab-1", "ui-tab-2", etc. Esto significa que cuando vuelva ordenar, agregar o eliminar pestañas, los marcadores se rompen. ¿Conoces una manera de hacer esto donde puedo usar nombres hash personalizados para las pestañas? – Billkamm

3

Muchas de las respuestas anteriores don No funciona con la versión actual de jQuery UI Tabs. Esto es lo que estoy usando actualmente:

var tabsUi = $('#tabs'); 
tabsUi.tabs(); 

// Add hash to URL when tabs are clicked 
tabsUi.find('> ul a').click(function() { 
    history.pushState(null, null, $(this).attr('href')); 
}); 

// Switch to correct tab when URL changes (back/forward browser buttons) 
$(window).bind('hashchange', function() { 
    if (location.hash !== '') { 
     var tabNum = $('a[href=' + location.hash + ']').parent().index(); 
     tabsUi.tabs('option', 'active', tabNum); 
    } else { 
     tabsUi.tabs('option', 'active', 0); 
    } 
}); 
+0

Solución perfecta, la única que funcionó para mí :) –

+0

gran solución funcionó para mí – jason

3

Mi manera de jQuery UI 1.10.3

$("#tabs").tabs({ 
    beforeActivate: function(event, ui) { 
     var hash = ui.newTab.children("li a").attr("href"); 
     window.location.hash = hash; 
    } 
}); 
1

Esto funcionó para mí usando jQuery 1.8

$('#tabs').tabs({ 
    activate: function(event, ui) { 
     window.location.hash = ui.newPanel.attr('id'); 
    } 
}); 
0

Este código funciona bien para mí:

$('#tabs').tabs({ 
    select: function(event, ui) { 
     window.location = $(ui.tab).attr('href'); 
    } 
}); 
6

mi solución sencilla y sin saltos:

$("#tabs").tabs({ 
     activate: function (event, ui) { 
      var scrollPos = $(window).scrollTop(); 
      window.location.hash = ui.newPanel.selector; 
      $(window).scrollTop(scrollPos); 
     } 
    }); 
-1

Este trozo de código que funcionó para mí:

window.location.hash=""; 
1

Después de mirar a través de algunas otras preguntas y los documentos API jQueryUI encontré que esto terminó funcionando para mí.

$(document).ready(function() { 
    $("#tabs").tabs({ 
     activate: function(event, ui) { 
      location.hash = ui.newTab.children(".ui-tabs-anchor").attr("href").substr(1); 
     } 
    }); 
}); 
0

Este código funciona para mí:

$("#tabs").tabs({ 
    activate: function(event, ui) { 
     window.location.hash=ui.newPanel.selector; 
    } 
}); 
0

El siguiente código se trabajó para mí ..

$("#tabs").tabs({ 
    activate : function(event, ui) { 
    window.location.hash = ui.newPanel[0].id; 
    } 
});