I de følgende eksempler bruger jeg SWFObject til at embbede swf-filerne. Hvis du ikke er vant til benytte SWFObject, er her en tutorial der giver dig en hurtig gennemgang: Sådan bruger du SWFObject.
Problem
Når en browser bliver bedt om at hente en swf-fil som den tidligere har loaded, vil den som standard hente filen fra cachen i stedet for fra serveren. Det er oftest fint nok, dog kan det give nogle problemer/frustrationer, når browseren benytter en cachet swf, selvom der findes en nyere version på serveren.
I Anti cache - del 1, fandt vi ud af at vi kan "narre" browseren til altid at hente en fil fra serveren, ved at tilføje en unik streng til filnavnet. Den samme teknik kan vi bruge her.
Løsning 1 - gør det manuelt
I denne løsning tilføjer du ganske enkelt et versionsnummer efter filnavnet på swf'en du vil embedde:
1 2 |
var so = new SWFObject("so_tester.swf?version=1", "sotester", "300", "300", "8", "#FF6600"); so.write("flashcontent"); |
Når du næste gang uploader en ny version af den samme swf-fil, forhøjer du versionsnummeret med en:
1 2 |
var so = new SWFObject("so_tester.swf?version=2", "sotester", "300", "300", "8", "#FF6600"); so.write("flashcontent"); |
På den måde vil browseren tror at so_tester.swf?version=2 er en ny fil, og derfor hente den opdaterede version fra serveren.
Fordele ved denne metode
- Brugeren vil altid se den nyeste version af swf'en (hvis du har husket at opdatere embed koden).
- Browseren vil kun hente swf'en fra serveren når det er nødvendigt.
Ulemper ved denne metode:
- Du skal manuelt ind og rette i din embed kode hver gang du har uploadet en ny versions af din swf-fil.
Løsning 2 - brug javascript:
Vi har altså konstateret at så længe vi tilføjer en unik streng efter filnavnet, vil browseren hente den nyeste version af filen fra serveren. Vi har også konstateret at vi ikke gider at ændre i vores embed kode, hver gang vi laver en ændring til vores swf.
I del 1 af denne serie, forklarede jeg hvordan man via Date objektet, kan generere en unik streng. Den teknik vil vi benytte igen, denne gang bare i JavaScript.
ActionScript og JavaScript begge bygger på ECMAScript specifikationerne, så derfor kan vi faktisk benytte den samme kode:
1 2 |
var so = new SWFObject("so_tester.swf?version="+new Date().getTime(), "sotester", "300", "300", "8", "#FF6600"); so.write("flashcontent"); |
JavaScript vil altså genererer et unik nummer for os, og filnavnet vil f.eks. se sådan her ud:
so_tester.swf?version=1167509828296
Fordele ved denne metode
- Brugerne vil altid se den nyeste swf, da browseren aldrig vil blive præsenteret for det samme filnavn.
- Vi slipper for at skulle rette i vores embed kode hver gang vi uploader en ny version af vores swf.
Ulemper ved denne metode:
- Browseren vil altid hente filen fra serveren og aldrig fra cachen, også selv om der ikke er ændret i swf.
Det er et problem, da det langt den største del af tiden er det fint at browseren cacher swf-fil. Der er jo ingen grund til at brugeren loader de samme 500kb fra serveren hver gang de besøger vores side, hvis de ligeså godt kunne hente dem fra cachen. - Det giver både unødvendig ventetid for vores brugere og unødvendig serverbelastning.
Løsning 3 - gør det serverside
Løsning 2 havde en stor ulempe, nemlig at swf-filen altid blev hentet fra serveren. Vi ønsker kun at swf'en bliver hentet fra serveren når der er en ny version, ellers skal den hentes fra browserens cache.
Heldigvis kan vi løser det problem med lidt serverside magi.
Vi benytter simpelthen vores serverside script til at aflæse hvornår swf-filen sidst er blevet opdateret. Tidspunktet vi aflæser bruger vi så som vores unikke streng.
Hvis du benytter PHP ser koden sådan her ud:
1 2 |
var so = new SWFObject("so_tester.swf?version=<?=filemtime('so_tester.swf')?>", "sotester", "300", "300", "8", "#FF6600");
so.write("flashcontent"); |
Benytter du ASP kan du gøre sådan her:
1 2 3 4 5 6 7 8 9 10 11 |
<% Set fso = Server.CreateObject("Scripting.FileSystemObject") Set swf = fso.GetFile(Server.MapPath("so_tester.swf")) lastmodified = swf.DateLastModified lastmodified = Replace(lastmodified ," ","") lastmodified = Replace(lastmodified ,"-","") lastmodified = Replace(lastmodified ,":","") %> var so = new SWFObject("so_tester.swf?version=<%=lastmodified%>", "sotester", "300", "300", "8", "#FF6600"); so.write("flashcontent"); |
Fordele ved denne metode:
- Brugeren vil altid se den nyeste version af swf'en
- Browseren vil kun hente swf'en fra serveren når det er nødvendigt.
Ulemper ved denne metode:
- Ingen
3 kommentarer
Mangler der ikke noget PHP og ASP i løsning 3?
Jo, det gjorde der - godt spottet
hehe, undrede mig også lidt