2009-02-20 18 views
47

Ho cercato di trovare un modo per modificare il parametro window.location.hash nella scheda attualmente selezionata in Jquery UI Tabs.modifica location.hash con le schede ui jquery

ho provato:

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

Ciò si traduce nel cambiare l'hash per #undefined quando la scheda è cambiato.

Ho anche provato:

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

Ma questo non sembra essere attivato a tutti.

Qualsiasi aiuto sarebbe apprezzato. Grazie.

Modifica: Sembra che parte del mio problema iniziale abbia qualcosa a che fare con js da qualche altra parte che interferisce con questo. Sia la risposta accettata che l'altra risposta suggerita leggermente modificata funzionano. Ringrazia tutti.

+0

stai cercando di aprire un link nella scheda in cui il link cliccato da ? –

+0

No, i collegamenti che sto aprendo fanno parte della pagina corrente, no ajax/etc. – Rob

+0

questa è una demo abbastanza impressionante di questa tecnica: [http://jqueryfordesigners.com/jquery-tabs/](http://jqueryfordesigners.com/jquery-tabs/) –

risposta

49

Nella funzione di gestione evento ui.tab è un elemento di ancoraggio. Puoi recuperare il suo valore hash in questo modo:

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

Questo lavoro fa per te?

+1

Purtroppo no, ricevo molti ui.tab errori non definiti al caricamento della pagina o al cambiamento delle schede. – Rob

+0

Ho provato con la demo che appare sulla pagina del documento e funziona perfettamente con FF 3 e IE 7. Stai attivando manualmente gli eventi? – Serxipc

+1

Ho provato come hai suggerito con la pagina demo e la tua soluzione ha funzionato, grazie per la soluzione, dovrò capire cos'altro nel mio codice gli impediva di funzionare. Grazie – Rob

4

Questo sarebbe quello che stai andando?

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

L'ho provato senza fortuna. Ho persino provato a mettere un avviso prima dell'impostazione window.location e non appare quando si cambiano le schede. L'unico modo in cui potevo farlo attivare era da tabsshow vincolante ma che finisce con un indefinito ui.tab – Rob

+1

Quando ho provato ad usare il codice demo questa soluzione leggermente modificata funzionava. L'unico cambiamento che suggerirei è di farlo: window.location.hash = ui.tab.hash; – Rob

+1

Questo ha funzionato come la soluzione migliore per me. Altri suggerimenti hanno portato la pagina a saltare alla scheda selezionata quando l'hash della posizione è stato aggiornato. Seconding "window.location.hash = ui.tab.hash;" al posto di ciò che è fornito nell'esempio, tho. –

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

Sembra che ui.tab non restituisca una stringa valida. (invece restituisce un valore non definito, quindi si direbbe che non restituisce nulla.)

Provare a cercare nella versione di dev di ui.jquery.js se ci sono ritorni lì, forse è necessario chiamare un bambino di ui.tab ;-)

+0

@Fabdrol hai bisogno di ui.tab.index;) –

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

Mentre alcune delle soluzioni sopra funziona, che provocano la pagina per saltare in alcuni casi, l'API window.location.hash è progettata per portarti in una parte specifica della pagina.

Questa soluzione pulita proposto here, risolve questo problema

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

Questo dovrebbe probabilmente essere contrassegnato come la risposta corretta. – wblaschko

8

Questo ha funzionato per me, jQuery UI 1.10:

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

Vedi anche: http://api.jqueryui.com/tabs/#event-activate

+0

questo funziona bene per me, tuttavia, sto usando ajax per caricare le mie schede, quindi l'hash è sempre "ui-tabs-1", "ui-tabs-2", ecc ... Ciò significa che quando ri- ordina, aggiungi o rimuovi le schede interrotte dai segnalibri. Sai un modo per farlo, dove posso usare nomi di hash personalizzati per le schede? – Billkamm

3

Molte delle risposte di cui sopra don funziona con la versione corrente delle schede dell'interfaccia utente jQuery. Ecco quello che sto attualmente in uso:

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

Soluzione perfetta, l'unica che ha funzionato per me :) –

+0

ottima soluzione ha funzionato per me – jason

3

Il mio modo di 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

Questo ha funzionato per me utilizzando jQuery 1.8

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

Questo codice funziona bene per me:

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

mia soluzione semplice senza saltare:

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

Questo pezzo di codice ha funzionato per me:

window.location.hash=""; 
1

Dopo aver esaminato alcune altre domande e i documenti API di jQueryUI ho scoperto che questo ha finito per funzionare per me.

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

Questo codice funziona per me:

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

Il seguente codice è lavorato per me ..

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