2009-02-20 11 views
47

Próbuję znaleźć sposób zmienić window.location.hash na aktualnie wybranej karcie w Jquery UI Tabs.zmiana location.hash z jquery ui tabulatory

Próbowałem:

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

Powoduje to zmianę skrótu do #undefined gdy karta zostanie zmieniony.

Próbowałem również:

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

Ale to nie wydaje się być wyzwalane w ogóle.

Każda pomoc zostanie doceniona. Dzięki.

Edycja: Wygląda na to, że część mojego początkowego problemu miała coś wspólnego z js, gdzie indziej przeszkadzało to. Zarówno przyjęta odpowiedź, jak i druga sugerowana odpowiedź nieznacznie zmodyfikowana, działają. Dziękuje wszystkim.

+0

próbujesz otworzyć odnośnik na karcie gdzie kliknięty link z ? –

+0

Nie, linki, które otwieram, są częścią samej strony, bez ajax/etc. – Rob

+0

To jest całkiem niesamowita demonstracja tej techniki: [http://jqueryfordesigners.com/jquery-tabs/](http://jqueryfordesigners.com/jquery-tabs/) –

Odpowiedz

49

W funkcji obsługi zdarzenia ui.tab jest elementem zakotwiczającym. Możesz odzyskać wartość mieszania w następujący sposób:

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

Czy to działa dla Ciebie?

+1

Niestety nie, otrzymuję wiele plików ui.tab to niezdefiniowane błędy po wczytaniu strony lub zmianie karty. – Rob

+0

Próbowałem z demonstracją, która pojawia się na stronie dokumentu i działa dobrze z FF 3 i IE 7. Czy wywołujesz zdarzenia ręcznie? – Serxipc

+1

Próbowałem, jak zasugerowałeś ze stroną demo i twoje rozwiązanie w końcu działało, dziękuję za rozwiązanie, muszę się dowiedzieć, co jeszcze w moim kodzie powstrzymało działanie. Dzięki – Rob

4

Czy to właśnie zamierzasz?

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

Próbowałem tego bez żadnego szczęścia. Próbowałem nawet wstawić alert przed ustawieniem window.location i nie pojawia się przy zmianie kart. Jedynym sposobem, w jaki mogłem go aktywować, było związanie tabsshow, ale kończyło się to niezdefiniowanym ui.tab – Rob

+1

Kiedy próbowałem użyć kodu demo, to rozwiązanie nieco zmodyfikowane działało. Jedyna zmiana jaką sugeruję, to: window.location.hash = ui.tab.hash; – Rob

+1

To działało jak najlepsze rozwiązanie dla mnie. Inne sugestie powodowały, że strona przeskakiwała do karty wybranej podczas aktualizacji skrótu lokalizacji. Seconding "window.location.hash = ui.tab.hash;" zamiast tego, co podano w przykładzie, tho. –

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

Wygląda na to, że sam ui.tab nie zwraca poprawnego ciągu. (zamiast tego zwraca undefined, więc możesz powiedzieć, że nic nie zwraca.)

Spróbuj rozejrzeć się w wersji dla ui.jquery.js, czy są tam jakieś zwroty, może musisz zadzwonić dzieckiem ui.tab ;-)

+0

@Fabdrol potrzebujesz ui.tab.index;) –

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

Chociaż niektóre z powyższych rozwiązań nie działa, powodują strona skakać w niektórych przypadkach, ponieważ interfejs API window.location.hash ma na celu przeniesienie do określonej części strony.

Ten gustowny rozwiązaniem proponowanym here, rozwiązuje ten problem

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

To powinno być prawdopodobnie oznaczone jako poprawna odpowiedź. – wblaschko

8

ten pracował dla mnie, jQuery UI 1.10:

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

Zobacz także: http://api.jqueryui.com/tabs/#event-activate

+0

działa to dobrze dla mnie, jednak używam ajaxa do ładowania moich zakładek, więc hash to zawsze "ui-tabs-1", "ui-tabs-2", etc ... To znaczy, kiedy ponownie porządkuj, dodawaj lub usuwaj tabulatory, w których łamane są zakładki. Czy wiesz, jak to zrobić, skoro mogę używać niestandardowych nazw skrótów dla kart? – Billkamm

3

wiele z powyższych odpowiedzi don działa z aktualną wersją kart jQuery UI. Oto co obecnie używam:

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

Idealne rozwiązanie, jedyne, które zadziałało dla mnie :) –

+0

świetne rozwiązanie sprawdziło się dla mnie – jason

3

Moja droga do 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

ten pracował dla mnie jQuery 1.8

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

Ten kod działa dla mnie ok:

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

moje proste rozwiązanie bez skoków:

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

Ten fragment kodu pracował dla mnie:

window.location.hash=""; 
1

Po przejrzeniu kilku innych pytań oraz dokumentację interfejsu API jQueryUI, którą odkryłem, że to się udało.

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

Ten kod działa dla mnie:

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

Poniższy kod pracował dla mnie ..

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