javascript - window.location.reload med tømming av cache
Jeg vil laste inn en side på nytt ved å bruke JavaScript, men jeg vil også tømme cache, slik at ved oppdatering av siden har siden de nyeste versjonene av alt fra serveren.
Andre nettlesere bortsett fra IE får ikke det nyeste innholdet.
Noen løsning for IE9?
Svar #1
reload() skal ta imot et argument som forteller den å gjøre en hard reload, altså å ignorere hurtigbufferen:
location.reload(true);
Jeg kan ikke gå god for påliteligheten, du bør kanskje undersøke dette nærmere.
Rediger (2021): Parameteren ble aldri standardisert og er blitt foreldet og fjernet i mer moderne nettlesere. Å legge til en kommentar hver tredje måned som beskriver dette faktumet vil ikke hjelpe.
Svar #2
Du kan gjøre dette på flere måter. Én, bare legg til denne meta-taggen i din head:
<meta http-equiv="Cache-control" content="no-cache">
Hvis du vil fjerne dokumentet fra cache, bør expires-metatagen fungere for å slette det ved å sette content-attributtet til -1 slik:
<meta http-equiv="Expires" content="-1">
http://www.metatags.org/meta_http_equiv_cache_control
I tillegg bør IE gi deg det nyeste innholdet for hovedsiden. Hvis du har problemer med eksterne dokumenter, som CSS og JS, legg til en dummy-parameter på slutten av URL-ene dine med gjeldende tid i millisekunder slik at den aldri er den samme. På denne måten vil IE, og andre nettlesere, alltid gi deg den nyeste versjonen. Her er et eksempel:
<script src="mysite.com/js/myscript.js?12345">
OPPDATERING 1
Etter å ha lest kommentarene innser jeg at du ønsket å programmere for å slette cachen og ikke hver gang. Det du kan gjøre er å ha en funksjon i JS som:
eraseCache(){
window.location = window.location.href+'?eraseCache=true';
}
Så, i PHP la oss si, gjør du noe slik:
<head>
<?php
if (isset($_GET['eraseCache'])) {
echo '<meta http-equiv="Cache-control" content="no-cache">';
echo '<meta http-equiv="Expires" content="-1">';
$cache = '?' . time();
}
?>
<!-- ... other head HTML -->
<script src="mysite.com/js/script.js<?= $cache ?>"
</head>
Dette er ikke testet, men bør fungere. I utgangspunktet vil JS-funksjonen din, hvis den kalles, laste siden på nytt, men legger til en GET-parameter på slutten av URL-en. Nettstedet ditt vil da ha noe backend-kode som ser etter denne parameteren. Hvis den eksisterer, legger den til metatagene og en cache-variabel som inneholder et tidsstempel, og legger det til skriptene og CSS-en som du har caching-problemer med.
OPPDATERING 2
Meta-taggen vil faktisk ikke slette cachen ved sideinnlasting. Så teknisk sett må du kjøre eraseCache-funksjonen i JS, når siden lastes, må du laste den på nytt for at endringene skal tre i kraft. Du bør kunne fikse dette med serverspråket ditt. Du kan kjøre den samme eraseCache JS-funksjonen, men i stedet for å legge til meta-tagger, må du legge til HTTP-cache-headers:
<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
?>
<!-- Here you'd start your page... -->
Denne metoden fungerer umiddelbart uten behov for å laste siden på nytt fordi den sletter hurtigbufferen før siden lastes og også før noe kjøres.
Svar #3
Jeg hadde dette problemet, og jeg løste det ved å bruke JavaScript
location.reload(true);
du kan også bruke
window.history.forward(1);
å stoppe nettleserens tilbakeknapp etter at brukeren logger ut av applikasjonen.
