© ilj ilj@flowsim.se
JavaScript på svenska 52:II
JavaScript cookies

document.cookie
(allmänt om cookies under JavaScript 52:I)
 
 



 
   Fyll i ditt namn i rutan
   &
   klicka på Set Cookie!

   
   
 
 
   Klicka på Get Cookie
   &
   se om det fungerar!
 
   
 


Den här koden placerar alltså en cookie i cookies-filen på den dator där sidan visas (mer om cookies-filen under JavaScript 52:I).
 
Nästa gång någon använder samma dator och samma webbläsare (under samma användarnamn) och laddar hem sidan som koden är placerad på talar koden om för webbläsaren att hämta upp den här cookien och skriva den på sidan.

 
Två funktioner används: en som sparar cookien - här kallas den cookieSetter() - och en som kollar om det finns någon cookie att hämta när sidan laddas - cookieGetter(). Så här ser de ut:
 

<SCRIPT LANGUAGE="
JavaScript"
     TYPE="
text/javascript">
<!--

function cookieSetter()
{
     namn=document.iljform.iljruta.value //1
     if(namn.length<1){namn="?"} //2
     var now = new Date() //3
     var enddate = new Date() //4
     enddate.setTime(now.getTime() + (1000*60*60*24*365)) //5
     document.cookie ="flowsim =" + escape(namn)
     + "; expires=" + enddate.toGMTString() //7
}
 
function cookieGetter(cname) //
{
var searched = cname + "=" //8
if (document.cookie.length > 0) //9
     {
     nstart = document.cookie.indexOf(searched) //10
     if(nstart != -1) //11
     {
     nstart += searched.length //12
     nend = document.cookie.indexOf(";", nstart ) //13
     if (nend == -1) //14
     nend = document.cookie.length //15
     return unescape(document.cookie.substring(nstart,nend)) //16
     }
     }
}
//
-->
</SCRIPT>

 
Följande bit - som anropar funktion cookieGetter() ovan - placeras där texten ska skrivas. Man kan förstås låta en javascript alert visas istället. Byt i så fall ut document.write etc mot alert("text text...").
 

<SCRIPT>
<!--

var yourname = cookieGetter("flowsim") //17
if (yourname != null)
     {
     document.write("Hej igen, "+ yourname+"!") //18
     }
else
     {
     document.write("Du har inte varit här ...") //19
     }
//
-->
</SCRIPT>
 
Placera en FORM med en textruta och en knapp någonstans mellan BODY-taggarna. Namnge både FORM och textruta. T ex:
 

<FORM NAME="
iljform">
<INPUT TYPE="
text"
     NAME="
iljruta"
     SIZE= "
20"
     MAXLENGTH="
20">
<INPUT TYPE="
button"
     VALUE="
OK! Spara!"
     onClick="
cookieSetter()">
</FORM>
 
LITE FÖRKLARINGAR
Sidan laddas och koden (fotnot 17) anropar
cookieGetter() för att se om det finns någon cookie att hämta. Cookiens namn - i exemplet "flowsim" - kommer in i funktionen som cname. Om det finns en cookie hämtas det namn som sparats i cookien och placeras i variabeln yourname. Nästa rad (fotnot 18) skriver i så fall ut texten (inom citationstecken) och det namn som sparats i cookien.
Om det inte finns någon cookie utförs i stället följande rad (fotnot 19), dvs den texten mellan citationstecknen skrivs ut.
 
Koden som sparar cookien.
Funktionen
cookieSetter() anropas i exemplet när man klickar på knappen (bilden) SetCookie.
Rad för rad händer följande:
 
1 variabeln
namn sätts till det namn som skrivits i en textruta som här fått namnet iljruta på en form som fått namnet iljform
 
2 om det nu är så att någon klickat på knappen utan att ha skrivit något i rutan sätts
namn till ? (kan förstås bytas ut mot vad som helst)
 
3 för att en cookie ska sparas i cookies-filen krävs att man anger ett datum när den ska tas bort; här inleds det med att
now sätts till dagens datum
 
4 utgångsdatum
enddate sätts också inledningsvis till dagens datum
 
5 här sätts
enddate till dagens datum plus ett år - allt uttryckt i millisekunder sedan 1 januari 1970 00:00:00
 
Om man inte ger några argument skapar new Date() ett datumobjekt för dagens datum
var now=new Date()
 
För att kunna jämföra datum kan man göra så att de uttrycks i millisekunder
now.getTime()
 
Därefter lägger man alltså till det antal millisekunder som går på ett år för att få fram ett datum ett år senare.
 
7 här sätts då cookien: ge cookien ett namn (här flowsim), använd escape på det namn som skrivits i rutan, och förse den med ett slutdatum.
Syntaxen är alltså "cookienamn=cookievärde;expires=slutdatum". Annat man kan sätta är t ex domain=domännamn,path=pathnamn.
 

 
escape ersätter tecken som inte hör till de alfanumeriska (förutom * - _ + / . @), t ex mellanslag med kod:
 
escape(& ett exempel?')
 
unescape('%26%20ett%20exempel%3F')
 
Koden som hämtar cookien
Cookiens namn (flowsim) kommer in i funktionen som
cname.
Cookien ser ut så här:

 
unescape(document.cookie)
 
t ex "flowsim=namnetfrånrutan;annancookie=444"

 
Den cookie som är aktuell här är alltså cookien "flowsim=namnetfrånrutan"; koden ska alltså leta rätt på "flowsim=" och därefter skriva ut den text som finns mellan "flowsim=" och före ett eventuellt ";" (om det finns fler cookies)
 
8
searched sätts till lika med den text som ska hittas
 
9 om det finns någon cookie så...
 
10 sätt
nstart till index för första bokstaven i coookiens namn (om det finns en cookie vars namn är flowsim och det är den enda eller första cookien sätts nstart här till 0 )
 
11 om
nstart är skilt från -1, dvs om det finns en cookie
 
12 den här raden kan lika gärna skrivas
nstart = nstart+searched.length; (om det finns en cookie vars namn är flowsim och det är den enda eller första cookien sätts nstart här till 8; koden har alltså hittat fram till första tecknet efter likhetstecknet)
 
13 efter likhetstecknet finns det namn som skrevs i rutan, men eftersom det kan finnas fler cookies efter den aktuella måste man leta efter det semikolon som i så fall finns före nästa cookie; man börjar letande från
nstart, dvs första tecknet efter likhetstecknet, och nend sätts till till index för först hittade semikolon.
 
14 hittas inget semikolon är den aktuella cookien den sista och...
 
15 man kan alltså sätta
nend till lika med cookiens längd
 
16 procenttecken och annat plockas bort med hjälp av
unescape så att namnet ser ut som före escape användes; namnet skickas tillbaka till kodbiten som skriver ut det på sidan
 
indexOf
- i första exemplet nedan är "n" det sökta tecknet; i de två följande är det ord som söks "flowsim"

 
'flowsim=namnfrånruta'.indexOf('n')
'flowsim=namnfrånruta'.indexOf('flowsim')
 
Mindre rörigt blir det förstås om man placerar textsträngen i en variabel, t ex
 
texten='flowsim=namnfrånruta'
texten.indexOf('flowsim')
 

 
Koden går att måla, kopiera, klistra in.
 

Sidan gjordes av
 
ilj
 
ilj@flowsim.se
 

 
Senast ändrad 8 oktober 1998.
 
Den här sidan hör hemma i ett ramsystem
hos:
www.flowsim.se
JavaScript på svenska