Avatar billede mantichora Nybegynder
16. marts 2007 - 14:51 Der er 22 kommentarer og
1 løsning

AJAX cacher. Få den til at holde op!

Jeg har ikke kunne undgå at opdage AJAX, og er gået hen og blevet ret vild med det efterhånden.

Så længe den kun henter statisk indhold, f.eks. fra HTML-sider, er der intet problem. Men jeg har lagt mærke til at den cacher indholdet meget længe. Altså, når jeg ændrer i den side jeg henter via AJAX, får jeg stadig den gamle i lang tid efter, selvom jeg trykker Ctrl+Shift+R i Fx, som burde rydde cachen for den side.

Hvis jeg nu begynder at lægge noget mere dynamisk indhold på den side, vil det jo være et kæmpe problem. Så det simple spørgsmål er sådan set:

Hvordan får jeg AJAX til at hente siden fra serveren HVER gang, og altså ikke cache noget?
Avatar billede olebole Juniormester
16. marts 2007 - 14:57 #1
<ole>

Hvis du har læret AJAX på nettet, er chancerne ikke gode for, det faktisk er AJAX, du laver. Hvad gør du?

/mvh
</bole>
Avatar billede mantichora Nybegynder
16. marts 2007 - 15:02 #2
Jeg ved godt jeg ikke returnerer dataene i JSON eller XML, men stadig.

Umiddelbart laver jeg bare et XMLHttpRequest objekt, bruger det til at loade en PHP side, og sætter hele siden ind på sitet, via obj.innerHTML = http.responseText.

Jeg ved ikke om du ligefrem har brug for at se kode, men igen - jeg vil bare have at siden altid hentes fra serveren, når jeg bruger http.open()
Avatar billede erikjacobsen Ekspert
16. marts 2007 - 16:27 #3
Man kan snyde cachen ved at sætte noget tilfældigt, og helst nyt hver gang, på URL-en

  whatever.php?r=234234

hvor tallet så er lavet med Javascripts tilfældighedsgenerator.
Avatar billede mantichora Nybegynder
16. marts 2007 - 16:36 #4
Vil det sige at så længe querystringen er forskellig fra sidste gang, vil den ikke cache?
Avatar billede erikjacobsen Ekspert
16. marts 2007 - 16:44 #5
Det håber jeg - ellers bliver jeg nok fyret. ;)
Avatar billede mantichora Nybegynder
16. marts 2007 - 16:46 #6
Heh :)
Det er jo smart. Så kan jeg gemme en md5(microtime()) i en session variabel i PHP, når folk besøger siden. På den måde kan jeg sørge for at den altid loader fra serveren første gang folk besøger siden i én session, men stadig forhindre server overload fordi den henter fra den hver gang.

Du må meget gerne lægge svar, erik.
Avatar billede erikjacobsen Ekspert
16. marts 2007 - 16:47 #7
Jeg samler slet ikke på point, tak.
Avatar billede mantichora Nybegynder
16. marts 2007 - 16:48 #8
Det gør jeg heller ikke. Tag dem nu alligevel, ellers ser jeg så nærig ud :P
Avatar billede madeindk Nybegynder
16. marts 2007 - 16:54 #9
Det er smartere at få JS til at gøre det med Math.Round(); sådan her:

var strURL = "dinside.php&noCache=" + Math.random(); + "";
Avatar billede madeindk Nybegynder
16. marts 2007 - 16:55 #10
Mente selvfølgelig Math.Round() :-)
Avatar billede madeindk Nybegynder
16. marts 2007 - 16:56 #11
Der skulle selvfølgelig stå Math.random, hehe. Koden skal se sådan her ud:
var strURL = "dinside.php&noCache=" + Math.random(); + "";

Jeg er vidst lidt træt i dag ;-)
Avatar billede mantichora Nybegynder
16. marts 2007 - 17:00 #12
Ja, det foreslog erikjacobsen også :)
Jeg tænkte bare at hvis jeg gemmer den i en PHP session, kan jeg sørge for at den kun henter fra serveren én gang per besøg, og derfor ikke belaster den unødigt.
I lige netop dette tilfælde handler det bare om, at jeg gerne vil have at folk, der besøger siden efter den er opdateret, ser nyeste version, og ikke den samme som sidste gang de besøgte (og cachede) siden.
Avatar billede madeindk Nybegynder
16. marts 2007 - 17:03 #13
Argh ok :)
Avatar billede mantichora Nybegynder
16. marts 2007 - 17:15 #14
Nå, men hvis erik virkelig ikke vil have de point, så lukker jeg da.

Tak for hjælpen.
Avatar billede karmicmind Nybegynder
16. marts 2007 - 20:03 #15
Det er formentlig fordi du bruger GET metoden i dine Ajax-requests... Prøv POST istedet, så burde den ikke cache det..
Avatar billede johan.o Nybegynder
17. marts 2007 - 16:22 #16
Jeg er klar over at du har fået et svar du er tilfreds med, men dette er 'klippet' fra http://developer.mozilla.org

If you do not set header Cache-Control: no-cache the browser will cache the response and never re-submit the request, making debugging "challenging."

Så måske det var en mulighed også.

Mvh. Johan
Avatar billede mantichora Nybegynder
19. marts 2007 - 17:30 #17
Mange tak, jer to sidste :)
Avatar billede olebole Juniormester
20. marts 2007 - 13:01 #18
En anden vigtig ting er, at man bør oprette et nyt XMLHttpRequest-objekt, hvergang serveren request'es - og destruere det igen, såsnart responsen er modtaget  ;o)
Avatar billede mantichora Nybegynder
21. marts 2007 - 14:03 #19
Bør man? Hvorfor egentlig?
Avatar billede olebole Juniormester
21. marts 2007 - 14:18 #20
Det er en grundlæggende regel i brugen af objekter - og AX-objekter i særdeleshed ... opret/destruer - opret/destruer påny.

På den måde leak'er browseren mindre hukommelse og ofte er den mindre tilbøjelig til at cache reponse-resultater
Avatar billede mantichora Nybegynder
21. marts 2007 - 14:23 #21
Hm. Tak - det prøver jeg da lige at skrive det om til :)
Avatar billede mantichora Nybegynder
21. marts 2007 - 14:32 #22
Hvordan destroyer jeg den egentlig korrekt? Så vidt jeg kan se er der ingen close() eller destroy() metoder til objektet. Er det bare at lave en ny?
Avatar billede olebole Juniormester
21. marts 2007 - 14:36 #23
Det kommer helt anpå, om http-objektet indlejres i et JS-objekt, eller 'hænger frit svævende' i koden. Generelt sætter man et objekt til værdien null - men der kan også være tale om event-handlers, der skal dræbes (onreadystatechange-event'ens, f.eks.)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester