Prva greska ti je nacin na koji citas cookie, document.cookie moze da izgleda ovako
jezik=srpski u kom slucaju bi tvoj kod radio, ali moze da izgleda i recimo ovako
jezik=srpski; bla=truc, u kom slucaju bi tvoja promenljiva
ime bila jednaka
srpski; bla.
Znaci u document.cookie se nalaze
svi kukiji koji su setovani za taj domen a koji su vidljivi na trenutnoj putanji. Ti kukiji su u formatu
ime=vrednost i razdvojeni su sa
; (tacka zarez posle koga ide razmak) sto znaci da moras prvo podeliti
document.cookie po tacka-zarezu pa proci kroz sve kukije u potrazi za onim koji tebi treba (
jezik).
To bi trebalo ovako nekako da izgleda:
Code (javascript):
function readCookie(name, defaultValue) {
var cookies = document.cookie.split('; ');
for (var i = 0; i < cookies.length; i++) {
var parts = cookies[i].split('=');
if (parts[0] == name) {
return parts[1];
}
}
return defaultValue;
}
Funkciju pozivas ovako:
readCookie('jezik'), ili ovako
readCookie('jezik', 'srpski'). U ovom drugom slucaju
'srpski' ce biti vraceno cak iako cookie nije setovan (default vrednost, moze biti sta god ti odgovara).
Hint: u danasnje vreme svaki browser ima neku javascript konzolu koja je odlicna za isprobavanje malih snippeta koda kao sto je ovaj. Npr ako koristis Chrome, developer tools otvaras sa Ctrl+Shift+I, odes na Console tab i prekopiras celu predhodnu funkciju, zatim je testiras tako sto je pozivas direktno iz te iste konzole.
Meni je bar to veoma korisno i cesto koristim takav pristup prilikom razvoja (umesto da ubacujem debug kod u js fajl u editoru, pa da cuvam pa da se vracam u browser i da refreshujem stranu da bi browser povukao izmene)..
Konkretna funkcija koju ja koristim za citanje kukija je sledeca (mozda malo deluje komplikovanija ali je u pitanju obican regularni izraz):
Code (javascript):
function readCookie(name, defaultValue) {
return (
document.cookie.match(
new RegExp(
'(?:^|;\\s+)' +
name.replace(/([\[\]|$^?\\])/g, '\\$1') +
'=([^;]+)(?:$|;)'
)
) || []
)[1] || defaultValue || '';
}
Sada nam treba funkcija koja upisuje kuki sa svim mogucim elementima (putanja, datum isteka). Funkcija koju ja koristim je:
Code (javascript):
function writeCookie(name, value, lifetime, path) {
var expires = '';
if (lifetime) {
expires = '; expires=' + (new Date(+new Date + lifetime * 1000)).toUTCString();
}
document.cookie = name + '=' + value + expires + '; path=' + (path || '/');
}
Ovde su
name i
value parametri naziv i vrednost kukija (redom),
lifetime predstavlja broj sekundi "zivota" kukija (tj koliko jos sekundi ce kuki biti zapamcen od strane browsera). Ukoliko se ovaj parametar ne prosledi (ili je jednak nuli) kuki nece imati podesen expires parametar i dobices tzv session cookie (koji se automatski brise kada se iskljuci browser). Poslednji parametar je putanja na kojoj ce kuki biti upisan i njega obicno ignorises :) (ako ga ne navades prilikom poziva ove funkcije bice upisano '/' tj root domena na kome se kuki upisuje).
E sad, tebi treba malo drugaciji kod, tj treba da podesis da kuki ne traje odredjen fixan vremenski period (kao sto to radi predhodna funkcija) vec da traje do odredjenog datuma, jednostavnom izmenom dobijamo ovo:
Code (javascript):
function writeCookie(name, value, date, path) {
var expires = '';
if (date) {
expires = '; expires=' + date.toUTCString();
}
document.cookie = name + '=' + value + expires + '; path=' + (path || '/');
}
Ovde smo
lifetime parametar (broj sekundi) zamenili sa
date parametrom koji predstavlja
Date objekat.
Sada jos samo treba da odredimo prvi sledeci ponedeljak, to mozemo ovako da izracunamo:
Code (javascript):
var now = new Date; // trenutni datum/vreme
var diff = 8 - now.getDay(); // getDay() vraca 0 za nedelju, 1 za ponedeljak, 2 za utorak, ...
if (diff == 8) { // ukoliko je danas nedelja moramo vratiti razliku sa 8 dana (drugi ponedeljak od danas) na 1 (prvi sledeci ponedeljak, tj sutra)
diff = 1;
}
var next_monday = new Date(now.getFullYear(), now.getMonth(), now.getDate() + diff, 0, 0, 0, 0);
kada to ubacimo u funkciju mozemo lako da koristimo prilikom setovanja kukija:
Code (javascript):
function getNextMonday() {
var now = new Date,
diff = 8 - now.getDay();
if (diff == 8) {
diff = 1;
}
return new Date(now.getFullYear(), now.getMonth(), now.getDate() + diff, 0, 0, 0, 0);
}
...
writeCookie('jezik', jezik, getNextMonday());
To je to vezano za kukije i datum, ostalo ti je jos redirektovanje na drugu adresu, to radis tako sto menjas
document.location, znaci ovako nekako:
Code (javascript):
var jezik = readCookie('jezik');
if (jezik == 'srpski') {
document.location = 'http://www.rts.rs';
} else if (jezik == 'engleski') {
document.location = 'http://www.bbc.co.uk';
}