webForumDet fria alternativet

Cookiebibliotek

2 svar · 6 579 visningar · startad av spango

spangoMedlem sedan juni 20008 205 inlägg
#1

Diskutera detta script

Detta script är till för alla som vill använda kakor i JavaScript, men som tycker att det är på tok för krångligt att hålla på med alla strängmetoder för att få det att funka bra. Min avsikt har varit att skapa ett lätthanterligt bibliotek för användning av kakor - men det krävs en viss kunskap i JavaScript för att kunna gör något vettigt av det. Du behöver inte vara någon expert, men däremot bör du känna dig hemma bland funktioner och konstruktorer för egna objekt (och om du inte gör det, kan du säkert gissa dig fram)
Kakorna som bakas av det här scriptet är avsedda att följa standarden på < http://home.netscape.com/newsref/std/cookie_spec.html >. Ja, det är Netscape som utvecklat den, men detta tycks vara den standard som används av flest webbläsare (även Internet Explorer). Detta script bör funka i alla webbläsare som stöder kakor och JavaScript. (Och om det inte gör det, låt mig veta det!)

Hela scriptet består av en klass, som heter Cookie.

Instantieras:
var kaka = new Cookie( name, value [, expires [, domain [, path [, secure]]]] )

När man skapar en ny instans av klassen Cookie skickar man med minst två argument, och max sex stycken. Det första argumentet används för att ge kakan ett namn. Det får vara av i princip vilken typ som helst, men jag rekommenderar att det är ett tal eller en sträng. Samma sak gäller för argument nummer två, kakans värde. Det får vara i princip vad som helst, men återigen rekommenderas att det är en sträng eller ett tal.

Skickar du det tredje argumentet, ska detta vara en sträng, ett tal (hel- eller flyttal spelar ingen roll) eller ett Date-objekt.
Om du skickar med en sträng, antas denna innehålla ett datum enligt formatet "Veckodag, DD-Mån-YYYY HH:MM:SS GMT" (till exempel: Wednesday, 09-Aug-2000 00:01:38 GMT för att motsvara den tidpunkt då detta skrevs). Ingen kontroll av formatet görs, så du får ta ditt ansvar :)
Används ett Date-objekt antas detta representera utgångsdatumet för kakan.
Används ett tal, antas detta representera antalet dagar kakan ska leva. Anges inget utgångsdatum alls för kakan, blir den "minnesresiderande", och stannar kvar i webbläsarens minne tills den stängs ner. Detta är användbart om du hade tänkt att spara data tillfälligt mellan två dokument eller liknande.

Argument nummer fyra anger vilken domän kakan får skickas tillbaka till. Denna sträng måste (enligt specifikationen) innehålla minst två punkter. Exempel på giltiga värden är .foo.com och cgi.webforum.nu. Dessutom kan ett script på en domän baka en kaka som skickas tillbaka till en annan domän. (Alltså, www.foo.com kan inte baka en kaka som kan hämtas av cgi.webforum.nu.)
Subdomäner kan däremot skicka kakor mellan varann. Är domain satt till .foo.com kan ett script på www.foo.com sätta en kaka som hämtas av ett script på cgi.foo.com.

Argument nummer fem anger vilken sökväg (fil eller katalog) som kakan får skickas till. Anger du "/" som värde skickas kakan till alla sidor på servern när de begärs. Skulle du sätta detta argument till /cgi-bin/ skulle kakan bara skickas tillbaka till script i katalogen /cgi-bin.
Utelämnas detta argument används webbläsarens standardinställning, som vanligtvis är att skicka kakan till filer och kataloger som ligger i samma katalog som scriptet som skickade kakan. Alltså, om /bageriet/kakburken.html bakar en kaka, kan /bageriet/bakelser.html och /bageriet/drycker/sockerdricka.html få tag på denna kaka, men inte /charkuteriet/korv.html. Vill du att alla filer ska kunna komma åt dina kakor, använd "/".

Det sjätte och sista argumentet som kan skickas till Cookie-konstruktorn är tämligen enkelt: Det är ett booleskt värde som, om det värderas till "true", anger att kakan enbart får skickas över säkra förbindelser, när det står https:// uppe i adressfältet.

Dessa värden kan även ändras i efterhand. Om din Cookie-instans heter kaka ser det ut så här... argument

  1. kan ändras genom kaka.name
  2. kan ändras genom kaka.value
  3. kan ändras genom kaka.expires
  4. kan ändras genom kaka.domain, och genom kaka.setDomainToCurrent() som sätter värdet av kaka.domain till namnet på domänen från vilken filen hämtades
  5. kan ändras genom kaka.path, och genom kaka.setPathToCurrent() som sätter värdet av kaka.path till sökvägen till den katalog som sidan som kör scriptet hämtades från
  6. kan ändras genom kaka.secure (som förslagsvis sätts till true eller false)

För spara en kaka i webbläsaren, anropas metoden kaka.set().

Det finns ytterligare tre metoder i Cookieklassen, men de behöver inte anropas med någon Cookieinstans. De är placerade i klassen enbart för att det verkade som ett logiskt ställe att ha dem på.

Cookie.get(name [, alt]) är förmodligen den du kommer använda mest. Den används för att hitta en kaka, med ett namn som motsvarar det första argumentet, och returnera dess innehåll.
Om kakan inte hittas, returneras det valfria argumentet "alt". Om inte "alt" skickats med och kakan inte hittas, returneras en tom sträng.

Cookie.remove(name [, path]) är en funktion som tar bort en befintlig kaka genom att sätta dess utgångsdatum till midnatt, nyårsdagen 1970. Skickas path med, tas enbart kakor med motsvarande path bort.

Cookie.getAllNames() returnerar en vektor som innehåller namnen på alla kakor som finns i "kakburken".

Exempel på hur klassen och dess metoder används:

/*
Instansiera en kaka som heter [b]FRUKOST[/b], innehåller
värdet "Spam, spam, spam, eggs and spam", och som lagras
i ett år:
*/
var kaka = new Cookie("FRUKOST", "Spam, spam, spam, eggs and spam", 365);

// Ändra innehållet i kakan:
kaka.value = "Spam, eggs, bacon and spam";

// Förläng kakans livstid till två år:
kaka.expires = 365 * 2;

// Slutligen, se till att värdet sparas
kaka.set();

/*
Skriv en hälsning till namnet som finns lagrat i kakan
USERNAME, och om den kakan inte hittas, skriv "du
mystiska främling" i stället.
*/
document.writeln("Trevligt att råkas, " + Cookie.get("USERNAME", "du mystiska främling") + "!");

/*
Ta bort kakan med namnet "FAVORITBIL", utan speciell path.
*/
Cookie.remove("FAVORITBIL");

Kort sammanfattning av klassen:
---------------------
Egenskaper:

  • kaka.name (vad som helst som kan lagras som sträng)
  • kaka.value (vad som helst som kan lagras som sträng)
  • kaka.expires (tal, sträng eller Date-objekt)
  • kaka.domain (sträng)
  • kaka.path (sträng)
  • kaka.secure (boolesk)

Metoder (för instanser):

  • kaka.set() (baka kakan)
  • kaka.setDomainToCurrent() (ändra kaka.domain till namnet på domänen kakan hämtades från)
  • kaka.setPathToCurrent() (sätt kaka.path till katalogen som sidan hämtades från)
  • kaka.expirationString() (returnerar en sträng motsvarande kakans utgångdatum, används enbart internt)

Metoder (statiska):

  • Cookie.get(name [, alt]) (hämta kakan "name", returnera alt om ingen finns)
  • Cookie.remove(name [, path]) (ta bort kakan "name" som har pathen "path")
  • Cookie.getAllNames() (returnerar en vektor med namnen på alla tillgängliga kakor)

red. Efter lite kosmetiska förändringar har koden nu fått postas i ett eget inlägg i denna tråd.

mikael_aMedlem sedan mars 2000475 inlägg
#2

kanon skript. tack

spangoMedlem sedan juni 20008 205 inlägg
#3
/*
 * Detta script skrivet är fritt för användning, spridning och modifiering.
 */

// Cookieklassen

function Cookie(name, value, expires, domain, path, secure){
	this.name    = name;
	this.value   = value;
	this.expires = expires;
	this.domain  = domain;
	this.path    = path;
	this.secure  = secure;
	
	}

// Metoder för cookieklassen

function set(){
	var cookiestr = escape(new String(this.name)) + "=" + escape(new String(this.value));
	if(this.expires) cookiestr += "; Expires=" + this.expirationString();
	if(this.domain)  cookiestr += "; Domain=" + this.domain;
	if(this.path)    cookiestr += "; Path=" + this.path;
	if(this.secure)  cookiestr += "; Secure";
	document.cookie = cookiestr;
	}

function expirationString(){
	var ex = this.expires;
	if(typeof ex == typeof "string") return ex;
	if(typeof ex == typeof 1){
		var msPerDag = 1000 * 60 * 60 * 24;
		ex = new Date();
		ex.setTime(ex.getTime() + (msPerDag * this.expires));
		}
	return ex.toUTCString ? ex.toUTCString() : ex.toGMTString();
	}

function setDomainToCurrent(){
	this.domain = self.location.host;
	}

function setPathToCurrent(){
	var pth = self.location.pathname.substr(self.location.pathname.indexOf("/"));
	if(!pth) pth = "/";
	else pth = pth.substring(0, pth.lastIndexOf("/") + 1);
	this.path = pth;
	}

// Allmäna funktioner

function getCookie(name, alt){
	if(!alt) alt = "";
	name = escape(name) + "=";
	if(document.cookie.indexOf(name) == -1) return alt;
	
	var kaka = document.cookie.substr(document.cookie.lastIndexOf(name));
	kaka = kaka.substr(name.length);
	var slut = (kaka.indexOf(';') == -1) ? kaka.length : kaka.indexOf(';');
	kaka = kaka.substring(0, slut);
	
	return unescape(kaka);
	}

function deleteCookie(name, path){
	var cookiestr = escape(name) + "=_; Expires=Thursday, 01-Jan-1970 00:00:00 GMT";
	if(path) cookiestr += "; Path=" + path;
	document.cookie = cookiestr;
	}

function getAllCookieNames(){
	var ac = document.cookie.split(" ");
	var allCookies = new Array();
	for(var i = 0; i < ac.length; i++){
		var tmp = ac[ i].split("=");
		allCookies[ i] = unescape(tmp[0]);
		}
	return allCookies;
	}

// Lägg till metoder

Cookie.prototype.set                = set;
Cookie.prototype.expirationString   = expirationString;
Cookie.prototype.setDomainToCurrent = setDomainToCurrent;
Cookie.prototype.setPathToCurrent   = setPathToCurrent;

// Statiska metoder

Cookie.get         = getCookie;
Cookie.remove      = deleteCookie;
Cookie.getAllNames = getAllCookieNames;
135 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)