Avatar billede pesmi Nybegynder
28. februar 2006 - 11:28 Der er 14 kommentarer og
1 løsning

Cache problem med javascript i IE

Er der nogen som ved hvad man skal skrive for at et .js script ikke bliver cachet i IE.

Jeg har en editor, innovaeditor (tidligere YUSASP editor), hvor det er muligt at inkl. en css fil, denne css fil kan man redigere på en anden side. Problemet ligger i at den ikke bliver opdateret i editoren, fordi editor.js bliver cachet.

Jeg bruger allerede nedenstående php script til at afbryde caching af siderne, hvilket virker fint i Firefox, men i IE cacher den alligevel alle .js og .css filer samt alle billeder til editor.js filen.

<?php
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

// HTTP/1.0
header("Pragma: no-cache");
?>

På forhånd mange tak
Avatar billede erikjacobsen Ekspert
28. februar 2006 - 11:57 #1
Hvis du kan hente din fil med en ny, unik parameter (fx tidspunkt) hver gang, så caches det ikke:

  fil.js?20060228115703
Avatar billede pesmi Nybegynder
28. februar 2006 - 13:52 #2
Det har jeg prøvet men det virker ikke. Grunden til det er at jeg i min index.php fil har et link til innovaeditor.js, dette script finder ud af hvilket sprog man bruger. Det bliver så inkluderet i editor.js filen, dvs. at hvis jeg giver den en unik query streng, kommer næste redirect til at se ud som følgende:

script/?123456editor.js

og resultatet er det samme hvis jeg gør det i innovaeditor.js filen:

script/editorLanguage/?123456editor.js
Avatar billede erikjacobsen Ekspert
28. februar 2006 - 14:04 #3
Det er ikke fordi det skal være:  script/editorLanguage/editor.js?123456
Avatar billede pesmi Nybegynder
28. februar 2006 - 14:54 #4
Jeg tror den tag query strengen og sætter den ind i url'en, for at finde ud af hvilken mappe den skal bruge, derfor er det ikke muligt at bruge en unik parameter.

dette er hvad der står i innovaeditor.js:

var oScripts=document.getElementsByTagName("script");   
var sEditorPath;
for(var i=0;i<oScripts.length;i++)
    {
    var sSrc=oScripts[i].src.toLowerCase();
    if(sSrc.indexOf("scripts/innovaeditor.js")!=-1) sEditorPath=oScripts[i].src.replace(/innovaeditor.js/,"");
    }

if(navigator.appName.indexOf('Microsoft')!=-1)
    document.write("<scr"+"ipt src='"+sEditorPath+"editor.js'></scr"+"ipt>");
else
    document.write("<scr"+"ipt src='"+sEditorPath+"moz/editor.js'></scr"+"ipt>");


dette er de to filer den selv henter:

scripts/editor.js
scripts/language/english/editor_lang.js
Avatar billede pesmi Nybegynder
28. februar 2006 - 15:07 #5
og nedenstående er redirect funktionen i editor.js filen:

/*** UTILITY OBJECT ***/
var oUtil=new InnovaEditorUtil();
function InnovaEditorUtil()
    {
    /*** Localization ***/
    this.langDir="english";
    try{if(LanguageDirectory)this.langDir=LanguageDirectory;}catch(e){;}
    var oScripts=document.getElementsByTagName("script");
    for(var i=0;i<oScripts.length;i++)
        {
        var sSrc=oScripts[i].src.toLowerCase();
        if(sSrc.indexOf("scripts/editor.js")!=-1) this.scriptPath=oScripts[i].src.replace(/editor.js/ig,"");
        }
    this.scriptPathLang=this.scriptPath+"language/"+this.langDir+"/";
    if(this.langDir=="english")
        document.write("<scr"+"ipt src='"+this.scriptPathLang+"editor_lang.js'></scr"+"ipt>");
    /*** /Localization ***/

    this.oName;this.oEditor;this.obj;
    this.oSel;
    this.sType;
    this.bInside=bInside;
    this.useSelection=true;
    this.arrEditor=[];
    this.onSelectionChanged=function(){return true;};
    this.activeElement;
    }
Avatar billede erikjacobsen Ekspert
28. februar 2006 - 15:12 #6
generelt burde du kunne

document.write("<scr"+"ipt src='"+this.scriptPathLang+"editor_lang.js?"+Math.random()+"'></scr"+"ipt>");
Avatar billede erikjacobsen Ekspert
28. februar 2006 - 15:13 #7
eller en anden værdi end lige noget random
Avatar billede pesmi Nybegynder
28. februar 2006 - 15:25 #8
det virker også på editor_lang.js filen, den bliver gemt som en ny fil hver gang man reloader siden, men det er editor.js filen som jeg har brug for at reloade, da det er der css filen bliver cachet.

Måske kunne en løsning være ikke at cache css filen, men det ved jeg heller ikke hvordan man gør. Ingen af filerne bliver cachet i Firefox, det er kun IE som er problemet.
Avatar billede erikjacobsen Ekspert
28. februar 2006 - 15:35 #9
Så sætter du en tilsvarende konstruktion på de andre steder. Og det er ikke IE som sådan, men en indstilling i IE, der vil cache mere end nødvendigt. Den eneste sikre måde, er at lave en ny URL hver gang, med noget efter en "?" i URL-en.
Avatar billede pesmi Nybegynder
28. februar 2006 - 15:54 #10
Jeg ville bare mene at når sætter siden til ikke at blive cachet så burder browseren ikke cache noget.

Men nu har jeg noget at lege med og nogle ideer til at løse problemet med, mange tak for hjælpen.

Da jeg er helt ny i dette forum, vil jeg lige bede om en sidste hjælp. Hvordan tildeler jeg dig disse point og hvordan lukker jeg spg.?

Igen, mange tak for hjælpen.
Avatar billede pesmi Nybegynder
28. februar 2006 - 16:25 #11
I nedenstående kode tag den query strengen fra editor.js og placerer den i editor_lang.js url'en, så den kommer til at se sådan ud:

scripts/?123456language/english/editor_lang.js

hvor den skulle ligne følgende:

scripts/language/english/editor_lang.js

Kan du fortælle mig hvordan jeg undgår det?

/*** Localization ***/
    this.langDir="english";
    try{if(LanguageDirectory)this.langDir=LanguageDirectory;}catch(e){;}
    var oScripts=document.getElementsByTagName("script");
    for(var i=0;i<oScripts.length;i++)
        {
        var sSrc=oScripts[i].src.toLowerCase();
        if(sSrc.indexOf("scripts/editor.js")!=-1) this.scriptPath=oScripts[i].src.replace(/editor.js/ig,"");
        }
    /*this.scriptPathLang=this.scriptPath+"language/"+this.langDir+"/";*/
    this.scriptPathLang=this.scriptPath+"language/"+this.langDir+"/";
    if(this.langDir=="english")
        /*document.write("<scr"+"ipt src='"+this.scriptPathLang+"editor_lang.js?"+Math.random()*5+"'></scr"+"ipt>");*/
        document.write("<scr"+"ipt src='"+this.scriptPathLang+"editor_lang.js?"+Math.random()*5+"'></scr"+"ipt>");
Avatar billede pesmi Nybegynder
28. februar 2006 - 16:51 #12
Har løst problemet med en  midlertidig løsning, ved at lave .css filen om til en .php fil og give den et unikt id nr. derved bliver den hentet ind som en ny fil hver gang editoren loades. Da php filen kun bruges i backenden og der også bliver genereret en css fil til frontenden, kommer det ikke til at påvirke frontenden, men det er stadig irriterende at jeg ikke kan løse det på en bedre måde.

Nu mangler jeg bare at finde ud af hvordan man lukker denne streng og giver dig dine point, he he, altid et nyt problem med en ny løsning.

Igen tak for hjælpen.
Avatar billede erikjacobsen Ekspert
28. februar 2006 - 17:00 #13
Jeg samler ikke på point, tak. Men det der med PHP filen og unikt id kan du bare gøre med css filen - der er ingen grund til at det nødvendigvis skal være php.
Avatar billede pesmi Nybegynder
28. februar 2006 - 17:11 #14
Det har du ret i, jeg havde prøvet det i css editoren og der virkede det ikke, samt i editoren, men det var bare fordi jeg ikke tænkte mig om, glemte at sætte php variablen til global, tak. Nogen gange er ting så simple men man gør dem selv mere besværlige end de er.
Avatar billede pesmi Nybegynder
08. marts 2006 - 12:38 #15
lukker spg.
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