Mam ustawiony przesuwany panel na mojej stronie internetowej.
Po zakończeniu animacji ustawiłem hash w ten sposób
function() {
window.location.hash = id;
}
(to jest oddzwonienie, które id
zostało przypisane wcześniej).
Działa to dobrze, aby umożliwić użytkownikowi dodanie zakładek do panelu, a także aby działała wersja bez JavaScript.
Jednak kiedy aktualizuję skrót, przeglądarka przeskakuje do lokalizacji. Myślę, że jest to oczekiwane zachowanie.
Moje pytanie brzmi: jak mogę temu zapobiec? To znaczy, jak mogę zmienić hash okna, ale nie pozwolić przeglądarce przewinąć do elementu, jeśli hash istnieje? event.preventDefault()
Coś w tym rodzaju?
Używam jQuery 1.4 i wtyczki scrollTo .
Wielkie dzięki!
Aktualizacja
Oto kod, który zmienia panel.
$('#something a').click(function(event) {
event.preventDefault();
var link = $(this);
var id = link[0].hash;
$('#slider').scrollTo(id, 800, {
onAfter: function() {
link.parents('li').siblings().removeClass('active');
link.parent().addClass('active');
window.location.hash = id;
}
});
});
javascript
jquery
hash
scrollto
Alex
źródło
źródło
event.preventDefault()
:)Odpowiedzi:
Można obejść ten problem, używając interfejsu API historii w nowoczesnych przeglądarkach ze starszymi przeglądarkami:
Kredyt trafia do Lea Verou
źródło
history.replaceState
(co w przypadku zmian skrótu może mieć więcej sensu), aby uniknąć potrzebypopstate
nasłuchiwania zdarzeń.hashchange
zdarzenia. Musiałem to obejść.hashchange
wydarzeniaProblem polega na tym, że ustawiasz window.location.hash na atrybut ID elementu. Jest to oczekiwane zachowanie przeglądarki, aby przeskoczyć do tego elementu, niezależnie od tego, czy użyjesz metody „disableDefault ()”, czy nie.
Jednym ze sposobów obejścia tego jest poprzedzenie skrótu dowolną wartością, taką jak:
Następnie wszystko, co musisz zrobić, to sprawdzić prefiksowany skrót podczas ładowania strony. Jako dodatkowy bonus, możesz nawet płynnie przewijać do niego, ponieważ masz teraz kontrolę nad wartością skrótu ...
Jeśli chcesz, aby to działało przez cały czas (a nie tylko podczas początkowego ładowania strony), możesz użyć funkcji do monitorowania zmian wartości skrótu i przeskakiwania do właściwego elementu w locie:
źródło
Tanie i paskudne rozwiązanie .. Użyj brzydkiego #! styl.
Aby to ustawić:
Aby to przeczytać:
Ponieważ nie pasuje i nie zakotwicza ani nie ma identyfikatora na stronie, nie przeskoczy.
źródło
window.location.hash = '#/' + id;
a następnie zastąpienie go:window.location.hash.replace(/^#\//, '#');
poprawi nieco adres URL ->projects/#/tab1
Dlaczego nie uzyskasz aktualnej pozycji przewijania, umieść ją w zmiennej, a następnie przypisz skrót i przewiń stronę z powrotem do miejsca, w którym się znajdował:
to powinno działać
źródło
Użyłem kombinacji rozwiązania Attila Fulop (Lea Verou) dla nowoczesnych przeglądarek i rozwiązania Gavin Brock dla starszych przeglądarek w następujący sposób:
Jak zauważył Gavin Brock, aby odzyskać id, będziesz musiał potraktować łańcuch (który w tym przypadku może mieć lub nie "!") W następujący sposób:
Wcześniej wypróbowałem rozwiązanie podobne do tego, które zaproponował user706270, ale nie działało dobrze z Internet Explorerem: ponieważ jego silnik Javascript nie jest bardzo szybki, możesz zauważyć wzrost i spadek przewijania, co daje nieprzyjemny efekt wizualny.
źródło
To rozwiązanie zadziałało dla mnie.
Problem z ustawieniem
location.hash
polega na tym, że strona przeskoczy do tego identyfikatora, jeśli zostanie znaleziony na stronie.Problem
window.history.pushState
polega na tym, że dodaje wpis do historii dla każdej karty, którą klika użytkownik. Następnie, gdy użytkownik kliknieback
przycisk, przechodzi do poprzedniej karty. (to może być, ale nie musi to być to, czego chcesz. nie tego chciałem).Dla mnie
replaceState
była lepsza opcja, ponieważ zastępuje tylko bieżącą historię, więc gdy użytkownik kliknieback
przycisk, przechodzi do poprzedniej strony.Sprawdź dokumentację History API na MDN.
źródło
Nie jestem pewien, czy możesz zmienić oryginalny element, ale co powiesz na zmianę z używania atrybutu id na coś innego, jak data-id? Następnie po prostu przeczytaj wartość data-id dla swojej wartości skrótu i nie przeskoczy.
źródło
To rozwiązanie zadziałało dla mnie
A mój pełny kod js to
źródło
Używając laravel framework, miałem pewne problemy z używaniem funkcji route-> back (), ponieważ kasowała ona mój hash. Aby zachować mój hash, stworzyłem prostą funkcję:
i ustawiłem to w mojej innej funkcji JS w ten sposób:
Możesz dowolnie nazwać wartości lokalnej pamięci masowej; mój nazwany
hash
.Dlatego też, jeśli hash jest ustawiony na STRONIE1, a następnie przejdziesz do STRONY2; skrót zostanie odtworzony na STRONIE1 po kliknięciu Wstecz na STRONIE2.
źródło