2010-09-17 19 views
5

Po prostu napotkałem jakieś dziwne zachowanie w Firefoksie 3.6/Mac. Podejrzewam jednak, że jest to ogólne zachowanie Firefoksa.Przekierowanie JavaScript (location.href) łamie przycisk Wstecz, chyba że użyto metody setTimeout()

Stworzyłem dwa martwe prostych stron testowych, które zmieniają właściwości window.location.href, aby przejść do nowego adresu URL:

Jeśli spróbujesz następujące albo pliku:

  • Otwórz nową/pustą kartę przeglądarki.
  • Wklej adres URL i naciśnij "Enter".

Zauważysz jedną różnicę między tymi dwoma: przy użyciu pierwszego linku przycisk "Wstecz" przeglądarki jest wyłączony; używając drugiego, jest włączony i działa tak, jak bym tego oczekiwał.

Jedyna różnica między tymi dwoma skryptami polega na tym, że ta ostatnia ustawia jednomutowy limit czasu przed zmianą window.location.href.

Nie wiem, dlaczego tak się dzieje i staram się osiągnąć zachowanie drugiego skryptu (gdzie przycisk "Wstecz" działa dalej zgodnie z oczekiwaniami) bez powodowania opóźnień dla użytkownika.

Domyślam się, że Mozilla Firefox traktuje natychmiastowe "przekierowanie", ustawiając window.location.href tak samo, jak przy użyciu metody window.location.replace(), ponieważ myślę, że programiści często używają tego pierwszego, gdy zamierzali użyć tego drugiego. Może użycie setTimeout, ponieważ powoduje to asynchroniczne uruchamianie kodu, powoduje porażkę tego zachowania. Czy to możliwe?

Nie eksperymentowałem z minimalną wartością dla setTimeout, aby osiągnąć pożądany efekt, ale zrobię to teraz. Chciałbym się dowiedzieć, dlaczego tak się dzieje dokładnie.

Dzięki!

+0

Pierwszy działa idealnie: naciśnij przycisk Wstecz i wróć na tę stronę. Po drugie, jedno z powrotem pokazuje pustą stronę, wraca tu druga strona. Jeśli otworzę w nowej karcie, pierwsza działa zgodnie z oczekiwaniami, nie ma żadnych dostępnych. Drugi powraca do pustej strony. To są dokładnie te zachowania, których oczekiwałbym od twojego opisu. –

+2

@Skip Head - dlaczego? dlaczego samo ustawienie limitu czasu zmieniłoby zachowanie? – sje397

+1

Przetestowałem dla Ciebie kilka innych przeglądarek: Zdarza się w Chrome na systemach Linux/Mac i Opera dla komputerów Mac. Nie dzieje się to w Safari na Macu ani w Firefoksie dla Linuksa. – Robert

Odpowiedz

1

Domyślam się, że może Firefox traktuje natychmiastowe "przekierowanie", ustawiając window.location.href tak samo, jak przy użyciu metody window.location.replace(), ponieważ myślę, że programiści często używają były, kiedy zamierzali użyć tego ostatniego. Być może przy użyciu setTimeout, ponieważ powoduje to asynchroniczne uruchomienie kodu, powoduje to porażkę. Czy to możliwe?

Byłem told Twoje przypuszczenie jest słuszne, ale teraz, gdy patrzę, nie wydaje się nie mieć żadnej wzmianki o tym wymogu w HTML5 spec (łączącej do najbardziej właściwej stronie, ponieważ trudno połączyć do braku wymagania).

2

Masz rację zakładając, że ustawienie location.href podczas ładowania strony jest traktowane jak zamiana. W rzeczywistości istnieją dwa oddzielne zachowania.

Po pierwsze, ustawienie location.href ze skryptu uruchomionego w wyniku parsowania tagu jest zawsze interpretowane jako zamiennik. To był implemented, aby odzwierciedlić zachowanie Netscape 4 i subsequentlytweaked.

Po drugie, każdy nowy dokument załadowany w wyniku działania programu obsługującego ładowanie jest zawsze interpretowany jako zamiennik. To był implemented, a także tweaked.

Ale jestem ciekaw, dlaczego tak chętnie to robisz, co oznacza, że ​​użytkownicy będą musieli użyć menu rozwijanego Wstecz, aby przejść do strony przed stroną. (Powrót do poprzedniej strony nie przydałby się, gdyby nadal przekierowywał ich do bieżącej strony.)

+0

Jednym z powodów, dla których ktoś nie chciałby zastąpić aktualnej strony w historii: mam bookmarklet, który przypisuje do window.location, aby przejść ze strony w jednej witrynie (która nie jest moją własnością) do powiązanej strony w innym teren. Bez setTimeout użycie bookmarkletu kasuje stronę początkową z historii. Z setTimeout działa tak, jak można by oczekiwać: uderz w bookmarklet, przeskocz na drugą stronę, a następnie naciśnij, aby wrócić, skąd przyszedłeś. –