Avatar billede limemedia Nybegynder
25. september 2000 - 11:24 Der er 20 kommentarer og
1 løsning

Caching problem : Inkludering af ekstern JS fil

Jeg har lavet et lille banner script der skal køres fra klienter uden adgang til serverside scripting - og dette virker for såvidt perfekt.

Jeg har valgt at løse opgaven med, at lave en JS include der inkluderer et JS script genereret af PHP - dette PHP ligger således på min egen server.

Koden jeg bruger til at include med er :
<!-- ---------- LJ Webnologics Banner Network -------------- -->
<SCRIPT LANGUAGE=\"JavaScript\" SRC=\"http://www.ljweb.com/sites/banner/ljwebbanner.php3?ID=ljweb\" TYPE=\"text/javascript\">
</SCRIPT>

<NOSCRIPT>
<IMG SRC=\"http://www.ljweb.com/sites/banner/ljwebbanner.php3?ID=ljweb\" BORDER=\"0\">
</NOSCRIPT>
<!-- ---------- LJ Webnologics Banner Network -------------- -->

Nu er det blot, at ihvertfald MSIE mener, at når man i JS inkluderer samme JS fil med selvsamme URL, ja så tager den en cachet version.

Det problem har jeg været ude for før hvor jeg løste det ved at sætte antal sekunder efter epoch som parameter, men det var PHP. Hvordan gør jeg nu det ?!?

Altså skal jeg have noget lignende :
<!-- ---------- LJ Webnologics Banner Network -------------- -->
<SCRIPT LANGUAGE=\"JavaScript\" SRC=\"http://www.ljweb.com/sites/banner/ljwebbanner.php3?ID=ljweb&Unique=29038923285\" TYPE=\"text/javascript\">
</SCRIPT>

<NOSCRIPT>
<IMG SRC=\"http://www.ljweb.com/sites/banner/ljwebbanner.php3?ID=ljweb&Unique=29038923285\" BORDER=\"0\">
</NOSCRIPT>
<!-- ---------- LJ Webnologics Banner Network -------------- -->

Hvor \"&Unique=29038923285\" skal genereres dynamisk. Kan jeg gøre dette med JS ?

Jeg ved, at det er muligt at indsætte en NOCACHE header i HTML koden men det vil jeg gerne undgå. Hvordan gør de store det ? LinkExchange bruger IFRAME så de laver det sikkert med HTML, men er der virkeligt ikke andre metoder ???


/ Lars
www.ljweb.com
Avatar billede limemedia Nybegynder
25. september 2000 - 13:32 #1
hmm, der skal vist en større gulerod til
Avatar billede nixen Nybegynder
25. september 2000 - 14:13 #2
Hvis jeg forstår dig ret er problemet vel ikke større end at generere et tilfældigt tal til \'Unique\' parameteren... Det har jeg ihvertfald selv brugt før.
Prøv noget i stil med
rndNum = Math.floor(Math.random()*100000)

rndNum skal jo så også sættes ind i din kode; hvis du insisterer på at gøre det hele client-side må du så generere en streng til src på img\'et og på script\'et; f.eks.
<script language=\"Javascript\" src=\"\" id=script1></script>
<img src=\"\" id=img1>

og derefter
script1.src = \"strengMedUrlOgGenereretNummer\"
img1.src = do;

Lad høre om du kan bruge det :)
Avatar billede limemedia Nybegynder
25. september 2000 - 14:24 #3
Hvordan får du lagt strengen ind i SRC på <SCRIPT Tagget ?

For 500 bananer ville jeg da forvente et eksempel der returnerer den færdige str
<SCRIPT LANGUAGE=\"JavaScript\" SRC=\"http://www.ljweb.com/sites/banner/ljwebbanner.php3?ID=ljweb&Unique=234567\" TYPE=\"text/javascript\">

Det er ikke meningen at JS scriptet på klienten skal fylde monster mange linier...

Beregning af det unikke id er ikke problemet... Problemet er hvordan det inkluderes i netop den linie !
Avatar billede limemedia Nybegynder
25. september 2000 - 14:25 #4
således at IE og andre browsere narres til at reloade filen og ikke blot hente det sidste resultat fra cachen
Avatar billede nixen Nybegynder
25. september 2000 - 14:28 #5
Jojo, jeg synes da også at 500 bobs er lidt rigeligt...
Det jeg prøvede at illustrere var at man ikke kan bruge en streng i et tag (dvs det kan man godt med IE5.0, men de fleste kører jo stadig 4..), derfor må man først bygge script/img tagget og derefter ændre det fra et andet script... det vil altså også kun fylde 2-3 linjer...
Avatar billede nixen Nybegynder
25. september 2000 - 14:32 #6
<html><head>
<script src=\"\" id=script1></script>
<script language=Javascript>
function changeSrc() {
unique = Math.floor(Math.random()*100000);
SRCstr = \'http://www.ljweb.com/sites/banner/ljwebbanner.php3?ID=ljweb&Unique=\'+unique;
script1.src = SRCstr
}
</script>
Avatar billede limemedia Nybegynder
25. september 2000 - 14:42 #7
det eksempel du laver med changeSrc... virker det i nyeste NN og MSIE eller ?

<SCRIPT SRC er jo et HMTL4 tag
Avatar billede nixen Nybegynder
25. september 2000 - 14:47 #8
Jeg tror ikke det virker til Netscape, der er min løsning altså den traditionelle NOCACHE, men ifølge MSDN er \'src\' en attribut på \'script\' tagget fra MSIE 4.0 og frem..
Avatar billede nixen Nybegynder
25. september 2000 - 14:49 #9
ifølge netscapes Client-side Javascript reference er \'src\' tagget kun eksposeret af LAYER og IMG :(
Avatar billede limemedia Nybegynder
25. september 2000 - 14:57 #10
som en udlænding ville sige \"Failure is not an option\"... Der må da være en måde at gøre det på uden NOCACHE... Igen, hvordan gør de store banner udbydere det ?
Avatar billede nixen Nybegynder
25. september 2000 - 15:07 #11
Nixen (ikke en kommentar til mig selv, men et udbrud..), ikke client-side.
Det de fleste gør er vel at bruge en middle-tier application til at generere html\'en så Unique er forskellig hvergang. Når klienter ikke har adgang til server-side scripting kan jeg ikke rigtigt se hvo\'n det skal lade sig gøre i NS...
Avatar billede limemedia Nybegynder
25. september 2000 - 15:23 #12
LinkExchange gør brug af en IFRAME... Jeg kan forestille mig at IFRAMEN indeholder et HTML dokument med en nocache der kalder JS filen eller hur ?
Avatar billede nixen Nybegynder
25. september 2000 - 15:27 #13
Det lyder sandsynligt - men IFRAME er jo et IE specifikt tag; Netscape har et LAYER tag man kan bruge lidt på samme måde i og med at det er en container man kan sætte src på..
Avatar billede limemedia Nybegynder
25. september 2000 - 16:39 #14
LinkExchange benytter

<!-- BEGIN LINKEXCHANGE CODE -->
<center><iframe src=\"http://leader.linkexchange.com/1/X1326029/showiframe?\" width=468 height=60 marginwidth=0 marginheight=0 hspace=0 vspace=0 frameborder=0 scrolling=no>
<a href=\"http://leader.linkexchange.com/1/X1326029/clickle\" target=\"_top\"><img width=468 height=60 border=0 ismap alt=\"\" src=\"http://leader.linkexchange.com/1/X1326029/showle?\"></a></iframe><br><a href=\"http://leader.linkexchange.com/1/X1326029/clicklogo\" target=\"_top\"><img src=\"http://leader.linkexchange.com/1/X1326029/showlogo?\" width=468 height=16 border=0 ismap alt=\"\"></a><br></center>
<!-- END LINKEXCHANGE CODE -->

men hvad returnerer det egentligt... IFRAME er IE specifik, men banneret virker med NN... Returnerer dette en HTML inde i Framen med en NOCACHE der så connecter videre eller ?

Jeg er ikke så vild med IFRAME, da mit banner kan returnere forskellige størrelser alt efter parametre... At begynde at konfigurere for meget er uhensigtsmæssig overfor de brugere der ikke ligefrem er \"eksperter\"
Avatar billede olebole Juniormester
25. september 2000 - 18:37 #15
<ole>
Hvorfor ikke bare:

<script language=\"JavaScript\">
<!--
    var bla = Math.floor(Math.random()*100000);
    document.write(\"<\\script language=\'JavaScript\' src=\'http://www.ljweb.com/sites/banner/ljwebbanner.php3?ID=ljweb&Unique=\"+bla+\"\'></\\script>\")
//-->
</script>

...?
/mvh
</bole>
Avatar billede olebole Juniormester
25. september 2000 - 18:38 #16
PS: HUSK at escape \'script\'...!!!  ;o)
Avatar billede nixen Nybegynder
25. september 2000 - 18:47 #17
<slår mig selv hårdt i hovedet>
Ja, for fanden, det er sguda ikke mere kompliceret end det!
</slår mig selv hårdt i hovedet>
Det er godt at i det mindste en herinde har en smule overblik :-)
Avatar billede limemedia Nybegynder
25. september 2000 - 19:37 #18
ole >> mest fordi jeg mente eksemplet ville være lidt for langt... men jeg vil koge det ned til en enkelt linie og tilføje det til koden... Håber det virker (kan jeg jo læse at det vil.

Havde selv været inde på løsningen men havde håbet på at det kunne gøres uden at JS skal genere et kald til JS
Avatar billede jumper Nybegynder
25. september 2000 - 21:56 #19
En lille tilføjelse:

Du kan blot nøjes med at inkludere antal milli-sekunder siden 1.Januar 1970, hvilket kan gøres meget simpelt:

var bla = (new Date()).getTime();

På en eller anden måde kan jeg bedre lide denne form for tilfældighed, da Math.random() i forvejen ikke er helt pålidelig til tilfældige tal og sandsynligheden for at du får det samme antal milli-sekunder er ekstremt lille.

Hvis du vil være absolut sikker, kan du kombinere begge dele:

var bla = (new Date()).getTime + Math.floor(Math.random()*100000);

Sandsynligheden for at du går ind på siden på akkurat samme milli-sekund som før (ved at sætte tiden tilbage på din maskine) samt at du får akkurat det samme tilfældige tal, er tæt på urealistisk.

En kombination af begge dele er nok bedst, da du aldrig kan regne med at få perfekt tilfældige tal på en PC, om det er Javascript eller C++. Hvis det er meget vigtigt for dig med tilfældige tal (f.eks. til krypterings-algoritmer), så find en god pseudo-random bit-generator på nettet.

/Thor
Avatar billede jumper Nybegynder
25. september 2000 - 21:56 #20
Det sidste eksempel skulle selvf. være

var bla = (new Date()).getTime() + Math.floor(Math.random()*100000);

;)

/YThor
Avatar billede limemedia Nybegynder
26. september 2000 - 10:28 #21
tak Jumper, det var jo også den random jeg lidt fiskede efter... Caching sker jo pr bruger, så at en skal reloade med den samme browser i samme millisekund er, ja, lidt urealistisk og irrellevant.


/ Lars
www.ljweb.com
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