2012-06-06 16 views
8

Wdrażam stronę internetową, która dynamicznie ustawia adresy URL przy użyciu History.js, gdy nowe sekcje są ładowane na pierwszą stronę za pośrednictwem ajax.Problemy z hasłami History.js w Internet Explorerze i wydaniu pushState

Wygląda na to, że działa dobrze, ale jest problem z sekcją skrótu w adresie URL, który History.js tworzy jako element zastępczy w Internet Explorerze.

Oto przykłady linków na stronie, tworzone przy użyciu jQuery:

function connect_browse_buttons(){ 
    $('.browselink').each(function(){ 
     $(this).click(function(){ 
      var action = $(this).attr('name'); 
      action = action.substring(('action_browse').length); 
      browsetype = action; 
      if (isIE){ 
       // remove data object and title to avoid use of SUIDs by History.js in IE 
       History.pushState(null, null, '/public/' + action); 
      } else { 
       History.pushState({oldurl: History.getState()['url']}, "Example " + action, config.wwwroot + "public/" + action); 
      } 
      return false; 
     }); 
    }); 
} 

Plik .htaccess przekierowuje żadnych adresów URL, takich jak http://example.com/public/category_a do http://example.com, gdzie javascript analizuje URL i ładuje odpowiedni punkt za pośrednictwem AJAX żądania w module changeState.

javascript sprawdza adresy URL, takich jak

http://example.com/public/category_a 

oraz dla równoważnych URL zastępczych utworzonych w programie Internet Explorer, tj

http://example.com/#public/category_a 

To wszystko działa OK - tak:

W Firefoksie, jeśli otworzę witrynę w katalogu głównym witryny, http://example.com i kliknę link, jak wyżej, zawartość lo reklamy (w przewodnika changeState) oraz adres URL jest ustawiony przez History.pushState jak:

http://example.com/public/category_a 

Gdybym następnie kliknij innego łącza URL jest ustawiony jak na przykład:

http://example.com/public/category_b 

w IE, gdybym otworzyć witrynę w katalogu głównym witryny, a następnie kliknij na link, jak na powyższym obciążeń zawartość i adres URL jest ustawiony z hash jak:

http://example.com/#public/category_a 

gdybym wtedy Cl ick następnego linku URL jest ustawiony jako:

http://example.com/#public/category_b 

Problem pojawia kiedy otworzyć stronę w IE, który został zakładek w Firefoksie, i nie ma hash w adresie URL. Weźmy nasz zwykły przykład:

http://example.com/public/category_a 

Gdybym otworzyć ten adres bezpośrednio w IE, poprzez zakładki lub wklejając adres URL w pasku adresu przeglądarki, .htaccess przekierowania pomyślnie, adres URL jest analizowany OK przez js plik i ładuje zawartość. Jednak teraz, gdy klikam na link category_b, adres URL jest ustawiony przez History.pushState do:

http://example.com/public/category_a#./category_b 

Co naprawdę chciałem było ustawić adres URL jako:

http://example.com/#public/category_b 

Jednak historia. Wydaje się, że js bierze cały poprzedni URL jako adres bazowy dla kolejnych pushStates. Próbowałem ustawić bezwzględne adresy URL w History.pushState, ale bez powodzenia. Jak widać w powyższym bloku kodu, mam specyficzną dla IE instrukcję pushState. Próbowałem skonfigurować to na różne sposoby.Jak mogę dostać Historia pushState rozpoznać:

http://example.com 

jako części podstawowej zawartości, której sekcja mieszania powinny być dołączone do? A może jest lepszy sposób podejścia do tego niż opisałem powyżej?

+0

Witam, czy udało Ci się znaleźć jakieś rozwiązanie problemu, kiedy strona jest odświeżana, przeglądarka ładuje pierwszy adres URL zamiast aktualnego? –

+0

Czy przeczytałeś ten quesiton ?: http://stackoverflow.com/questions/14342912/using-history-pushstate-in-ie9 Może znajdziesz pomocne wskazówki: – nikoskip

+0

dlaczego nie zrobić pushstate do public/category_a i "redirect" do # usunąć hasz, gdy działa funkcja pushstate? –

Odpowiedz

0

AFAIK, api historii zawsze będzie używać całego adresu URL (sans hash), który był wymagany przy początkowym ładowaniu strony. Po załadowaniu strony możesz użyć api historii, aby zmienić to, co przychodzi po tym początkowym adresie URL, lub możesz użyć zmian mieszania, aby zmienić to, co przychodzi po tym początkowym adresie URL, ale nie ma sposobu, aby go zmodyfikować bez przeładowania całej strony.

Jedyną opcją, którą znam, aby osiągnąć to, czego szukasz, to przekierowanie serwera/przepisanie wszystkich adresów URL na wybrany bazowy adres URL, a następnie przekazanie swojej ścieżki, nazwy pliku, parametrów, hasha itp. router/kontroler po stronie klienta. Muszę odradzać to, ponieważ (bez zbyt wielu szczegółów) linki z twojej strony internetowej udostępnionej na Facebooku zawsze będą przekazywane pod numer http://example.com/ lub pod jakimkolwiek adresem bazowym.

W mojej opinii iw mojej praktyce nie używam historii api i zamiast tego używam zmian hash, ponieważ działa wszędzie. Nie zawsze jest to przyjemne, ale uważam, że powinieneś dążyć do uzyskania prawidłowej odpowiedzi serwera WWW dla adresów URL oprócz wartości mieszania. Jest to szczególnie brzydki URL ze strony internetowej: http://www.respectfulrevolution.org/road/videos/ian_barlow_finding_our_roots_forest#/road/videos/marcy_westerling_livingly_dying, ale po załadowaniu do przeglądarki, serwer odpowiada, co widzisz tutaj: http://www.respectfulrevolution.org/road/videos/ian_barlow_finding_our_roots_forest, a następnie kontroler po stronie klienta ładuje to, co widzisz tutaj: http://www.respectfulrevolution.org/#/road/videos/marcy_westering_livingly_dying , które powinny się załadować taki sam jak: http://www.respectfulrevolution.org/road/videos/marcy_westering_livingly_dying

Powiązane problemy