2012-01-08 19 views
6

first off Nie mogę określić, do czego służy pierwszy parametr funkcji pushState? Co mam przekazać? Po prostu chcę zmienić adres URL podczas przewijania strony. Pytam identyfikator bieżącego elementu w oknie roboczym, a jego identyfikator powinien również być linkiem w adresie URL. Działa to dobrze z poniższym kodem.HTML5/jQuery: pushState i popState - głęboki link?

var currentHash, 
     url; 

    if (history && history.pushState) { 

     $(window).scroll(function() { 
      hash = $('.layer:in-viewport').attr('id'); 
      catHash = $("#"+hash).parent('section').attr('id'); 

      var data = "nothing"; 

      if (catHash != undefined) 
       url = "/" + catHash + "/" + hash; 
      else 
       url = "/" + hash; 

      if (currentHash != hash) { 

       window.history.pushState(data, hash, url); 

      } 

      currentHash = hash; 

     }); 

    } 

Teraz mam dwa pytania:

1.) Teraz adres URL w pasku adresowym zmiana stanu powodzeniem kiedy przewijać mojej stronie. Jak mogę zapytać adres URL/hash na pasku adresu, gdy początkowo ładuję stronę. Więc wyobraź sobie, że mam teraz link taki jak www.url.com/deep Chcę się dowiedzieć, co/gdzie jest głęboki? Czy po prostu muszę przesłać zapytanie do całej witryny top.location i podzielić ją na "/"? Mam na myśli, że te linki w rzeczywistości nie istnieją, więc jak mogę uniknąć 404 stron podczas wywoływania adresu URL, który zmanipulowałem za pomocą funkcji pushState?

2.) Jak mogę znaleźć ostatnią zmianę na pasku adresu po kliknięciu przycisku Wstecz? Więc chcę znaleźć /deep po kliknięciu przycisku wstecz przeglądarki, aby móc wrócić do tej pozycji na stronie. Myślę, że to prawdopodobnie działa z Popstate, ale nie mogłem dowiedzieć się, jak!

Dziękuję za pomoc!

Aktualizacja:

window.history.pushState("test", hash, url); 

...

$(window).bind('popstate', function(event){ 
     console.log(event.data); 
    }); 

to sprecyzowane zerowa. Czy nie powinieneś tego "testu" zwrócić?

+0

'event.state' nie' event.data' – Quentin

+0

Tak, próbowałem, ale nie ma '' event.state' kiedy konsola .log (event); 'Istnieją tylko dane, jednak dane zawsze mają zawsze wartość" null "i jeśli próbuję zalogować' event.state', to zawsze ma on wartość zerową! – matt

+1

Ok, znalazłem rozwiązanie ... wydaje się, że '$ (okno) .bind ('popstate', funkcja (zdarzenie) {' nie działa, ale 'window.onpopstate = funkcja (zdarzenie) {' does! – matt

Odpowiedz

6

do czego służy pierwszy parametr funkcji pushState?

Od the documentation

obiekt stanu - Obiekt stan jest obiekt JavaScript, który jest związany z nowym wpisem historii stworzonej przez pushState(). Za każdym razem, gdy użytkownik przechodzi do nowego stanu, zdarzenie popstate jest uruchamiane, a właściwość state zdarzenia zawiera kopię obiektu stanu wpisu historii.

Jest to pakiet wybranych danych, który otrzymasz po powrocie do tego stanu.

W tej chwili adres URL paska adresu zmienia się pomyślnie po przewinięciu strony. Jak mogę zapytać adres URL/hash na pasku adresu, gdy początkowo ładuję stronę.

Spójrz na obiekt location ... ale nie musisz. Możesz (i powinieneś) zapełnić stronę serwera strony. Jest to jedna z zalet pushState, link działa nadal, jeśli JavaScript nie jest dostępny, a powrót strony po stronie serwera jest płynnie zintegrowany.

Jak mogę znaleźć ostatnią zmianę na pasku adresu po kliknięciu przycisku Wstecz?

dodać detektor zdarzeń (patrząc na imprezę popState), a dane, które przechowywane są w niej dostępne będą na obiekcie zdarzenia. MDN has an example

+0

Dziękuję, prawie dostałem to.Zaktualizowałem moje pytanie dla popstate thingy.Tak więc mogłem przechowywać np. ciąg jako pierwsze dane atrybut w pushState i odzyskać go po naciśnięciu przycisku wstecz, prawda? Po prostu muszę wiedzieć, jak mogę zapytać o ostatnią zmianę, którą zrobiłem z pushState po naciśnięciu przycisku wstecz przeglądarki i jeszcze jedno: dostaję rzecz na serwerze, jednak w jaki sposób mogę (w moim przypadku) z pojedynczym układem strony powrócić na tę stronę i zapytać o pasek adresu? Mam pojedynczy układ strony, na którym chcę zmienić adres URL tylko w określonej pozycji na stronie ... – matt

+0

Po wysłaniu jeden z tych genereated (non-existend) deep-link s i ktoś otwiera je w przeglądarce Chcę przeskoczyć do tej pozycji na stronie. Jak widać powyżej, '/ url' po prostu pasuje do identyfikatora elementu w rzutni ... hash = $ ('. Layer: in-viewport'). Attr ('id');' Więc gdy 'div # example 'jest w okienku obrazu mój adres URL wygląda jak' abc.com/example'. Kiedy przeładowuję stronę, chcę przetestować ten '/ przykład' i dodać' # 'i przejść do tej pozycji na stronie. Jak mogę to zrobić? – matt

+0

W jaki sposób wykorzystujesz dane, które tam przechowujesz? –

4

jQuery abstrahuje się obiekt zdarzenia, chcesz: event.originalEvent.state;

Powiązane problemy