13

Mam odznakę "nowych przedmiotów" na stronie, którą chcę zaktualizować natychmiast, gdy strona zostanie załadowana z pamięci podręcznej (tj. Po naciśnięciu "Wstecz" lub "Przekaż", aby powrócić na tę stronę). Jaki jest najlepszy sposób na osiągnięcie tego?Czy moja strona ładowana jest z pamięci podręcznej przeglądarki?

Konfiguracja jest całkiem prosta. Układ aplikacji wyszukuje nowe elementy co 8 sekund i aktualizuje odpowiednio listę znaczników + elementów.

$(function() { 
    setInterval(App.pollForNewItems, 8000); 
}); 

Gdy ktoś odejdzie od tej strony, aby obejrzeć szczegóły przedmiotu, może się zdarzyć. Rzeczy są "nowe", dopóki użytkownik ich nie obejrzał, a aplikacja prawdopodobnie będzie miała kilku użytkowników jednocześnie (rodzaj przepływu pracy używanego w centrum obsługi telefonicznej lub biletów wsparcia).

Aby upewnić się, że odznaczenia są zawsze aktualne, mam:

$(window).bind('focus load', function (event) { 
    App.pollForNewItems(); 
}); 

..i jeśli to działa, sondowania nowych elementów na „obciążenie” jest użyteczne tylko wtedy, gdy strona jest ładowany z pamięć podręczną. Czy istnieje niezawodny, oparty na różnych przeglądarkach sposób sprawdzania, czy strona jest ładowana z pamięci podręcznej?

Odpowiedz

6

Częściowym, hackowskim rozwiązaniem jest posiadanie var z aktualnym czasem ustawionym na serwerze i ustawienie var z bieżącym czasem klienta na górze strony. Jeśli różnią się one o więcej niż pewien próg (1 minutę?), Możesz założyć, że jest to buforowana strona.

Przykład JS (używając ASP.Net składnia stronie serwera):

var serverTime = new Date('<%= DateTime.Now.ToUniversalTime().ToString() %>'); 
var pageStartTime = Date.UTC(new Date()); 
var isCached = serverTime < pageStartTime && 
       pageStartTime.getTime() - serverTime.getTime() > 60000; 

Alternatywnie, przy użyciu ciasteczek po stronie klienta (zakładając, że pliki cookie są włączone), można sprawdzić cookie z unikalnym kluczem dla bieżącej wersji strony. Jeśli nie istnieje, piszesz do niego plik cookie, a na każdym innym dostępie do strony istnienie pliku cookie wskazuje, że jest on ładowany z pamięci podręcznej.

E.g. (Zakłada cookies niektóre funkcje pomocnicze są dostępne)

var uniqueKey = '<%= SomeUniqueValueGenerator() %>'; 
var currentCookie = getCookie(uniqueKey); 
var isCached = currentCookie !== null; 
setCookie(uniqueKey); //cookies should be set to expire 
         //in some reasonable timeframe 
+1

Nie będę zależał od tego, czy serwer i klient zostaną zsynchronizowane szczególnie dobrze:/ – Matchu

+0

Problem polega na tym, że zakładasz synchronizację zegarów. Czas w JS zależy od czasu lokalnego komputera, który może znacznie różnić się od czasu serwera. – Yahel

+0

Dobre rzeczy, zaktualizuję UTC. – jball

0

Osobiście chciałbym ustawić atrybut danych zawierający identyfikator produktu dla każdego elementu.

tj.

<ul> 
    <li data-item-id="123">Some item.</li> 
    <li data-item-id="122">Some other item.</li> 
    <li data-item-id="121">Another one..</li> 
</ul> 

Twoja funkcja App.pollForNewItems by chwycić atrybut pierwszego elementu data-item-id (jeśli Najnowszy są pierwsze) i wysłać go do serwera ze swoim pierwotnym wniosku.

Serwer zwróci następnie tylko te elementy, które można następnie dodać do listy.

Nadal nie rozumiem, dlaczego chcesz wiedzieć, czy przeglądarka ma buforowaną wersję strony.

Czy istnieje również powód do wiązania się z load zamiast z ready?

  • Christian
+0

Chrześcijańska, dobra sugestia, chociaż aplikacja już robi dokładnie to, opisujesz (chociaż znaczniki czasu są porównywane zamiast identyfikatorów). Jeśli chodzi o używanie "load" zamiast "ready", chcę również powiązać z wydarzeniem "focus" i chcę zachować mój kod DRY. "Gotowy" jest sztucznym zdarzeniem skonstruowanym przez jQuery i może być związany tylko z dokumentem. Jeśli spróbujesz '$ (document) .bind (" focus ready ", {...})', handler nigdy nie zostanie wystrzelony dla zdarzenia 'focus'. Ponieważ różnica czasu między zdarzeniami "gotowymi" i "obciążonymi" powinna być pomijana w przypadku stron załadowanych z pamięci podręcznej, ładowanie jest tutaj w porządku. – Blackcoat

7

Można zapytać przeglądarkę internetową, aby nie buforować stronę.Spróbuj tych nagłówków HTTP:

Szczególnie Cache-control: no-store jest interesujący, ponieważ informuje przeglądarkę, aby nie przechowywać w pamięci strony w ogóle, co zapobiega nieświeży strony ładowany gdy klikniemy przycisk wstecz/do przodu.

Jeśli zrobisz to zamiast tego, nie będziesz musiał odpytywać danych za wczytanie strony.

+0

Nie myślałem nawet o buforowaniu nagłówków! Jest to prawdopodobnie właściwe podejście, o ile wydajność nie zostanie osiągnięta (chciałbym się upewnić, że nie wymusza na UA zawsze pobierania wspólnych zasobów, które powinny być buforowane w całej aplikacji, np. JS, CSS, obrazy). Chociaż jest to rozwiązanie problemu, nadal jestem ciekawy, czy można wykryć, czy strona jest ładowana z pamięci podręcznej przez JS. jakieś pomysły? – Blackcoat

+0

Nie wiem, czy istnieje sposób na określenie, czy strona pochodzi z pamięci podręcznej, czy nie. @jball ma dobry pomysł na wykrycie daty, kiedy strona została wyrenderowana. – Jacob

+0

Gdzie dokładnie jeden ustawia te zmienne? – YakovL

10

Navigation Timing jest teraz w większości przeglądarek (IE9 +) http://www.w3.org/TR/navigation-timing/#sec-navigation-info-interface

if (!!window.performance && window.performance.navigation.type === 2) { 
    // page has been hit using back or forward buttons 
} else { 
    // regular page hit 
} 
+0

to rozwiązanie nie działa w Firefoksie? Czy istnieje również obejście tego problemu dla Firefoksa? – Ralph

+0

najlepsza odpowiedź dla mojego problemu !! – mgh

0

spróbuj wykonać skrypt w pliku js.

Powiązane problemy