(naciśnij spację, żeby kontynuować)
Tym razem, wyjątkowo, do pełnego przetestowania omawianych zagadnień będą nam potrzebne konkretne narzędzia*:
* Narzędzia te nie są absolutnie wymagane, jednak niektórych ćwiczeń nie uda się bez nich dziś zrobić.
W dzisiejszym ćwiczeniu:
Jednym z zastosowań ciastek jest śledzenie naszych poczynań w sieci
UE uznała, że jeżeli będzie wymagana zgoda użytkownika na zapisanie ciastka, to problem będzie rozwiązany
Dyrektywa 2009/136/EC Rady Europy nakłada na dostawców treści internetowych, którzy chcą zapisywać dane w przeglądarce (nie tylko przez cookie, ale też przez inne mechanizmy, jak localStorage) obowiązek uzyskania zgody na taką czynność
W praktyce nic się nie zmieniło. Czy ktoś, kiedyś nie zgodził się na zapisanie ciastka?
Ale za to musimy wiedzieć, jak zrobić informację o cookies
Ciastko (profesjonalnie nazywa się "HTTP Cookie") to po prostu fragment danych, które są zapisywane przez stronę internetową w przeglądarce i które mogą być odczytane przez serwer, który tę stronę wygenerował.
Jest to jeden z najstarszych i najbardziej rozpowszechnionych sposobów zapisywania danych w przeglądarce.
Do działania nie wymaga JavaScript.
Przypomnienie: narzędzia programisty w Chrome włączamy przez F12 (Command+Option+I na macOS)
Do manipulacji ciasteczkami służy document.cookie
Odczytanie wszystkich ciasteczek
var allCookies = document.cookie;
// np. => 'nazwa1=wartość1; nazwa2=wartość2; nazwa3=wartość3'
Zapisanie ciasteczka*
document.cookie = 'nazwa=wartosc; max-age=3600';
* document.cookie działa bardziej jak wpłatomat, niż normalna zmienna - zapisanie ciasteczka nie nadpisuje innych ciasteczek.
Wprowadzony w ramach standardu HTML5, a więc stosunkowo młoda technologia (IE8+)
Widoczny tylko dla przeglądarki (ciastka są widoczne także dla serwera)
Można w nim przechować więcej danych, ok. 1000 razy więcej niż w ciastkach
Duuuużo łatwiejszy w użyciu
Do działania wymaga JavaScript
* protokół://domena:port (np: https://www.mojadomena.pl:6666)
Zapisywanie danych do local storage
localStorage.setItem('nazwa', 'wartość');
Odczyt z local storage i zapisanie do zmiennej
var zmienna = localStorage.getItem('nazwa');
Usuwanie danych z local storage
localStorage.removeItem('nazwa');
Usuwanie całej zawartości local storage
localStorage.clear();
Stąd pobierzesz paczkę z kodem źródłowym
Po wypakowaniu znajdziesz w głównym folderze kilka plików. Nas w tej chwili interesuje webstorage.html.
Jeśli używasz narzędzi zaproponowanych na początku, otwórz przeglądarkę Chrome i wybierz zakładkę Apps
Następnie wybierz aplikację Web Server
Otworzy się nowe okienko, a w nim wybieramy katalog, w którym mamy rozpakowane pliki z kodami źródłowymi.
Przy domyślnych ustawieniach wystarczy w nowej zakładce otworzyć stronę o adresie http://127.0.0.1:8887
Przejdź do katalogu, w którym mamy rozpakowane pliki z kodami źródłowymi.
Otwórz w przeglądarce plik webstorage.html
Otwarta strona webstorage.html zawiera prosty formularz, za pomocą którego możemy zmieniać kolor tła i tekstu.
Sprawdźmy przez chwilę, jak to działa.
Są tu również dwa przyciski, które nic nie robią (na razie)
Otwórzmy plik webstorage.html w swoim ulubionym edytorze i popatrzmy przez chwilę na kod.
Celem naszego pierwszego zadania będzie zapisanie po naciśnięciu przycisku Save
aktualnie ustawionych kolorów w localStorage i sessionStorage
Może tak:
To nie było trudne, tylko skąd wziąć aktualne wartości kolorów?
Spróbujmy napisać funkcję saveColors, która realizuje pierwsze zadanie!
Czy możemy wykorzystać istniejący już kod?
Gotowe?
Wyszło nam pewnie coś takiego:
function saveColors() {
localStorage.setItem(
'backgroundColor',
document.body.style.backgroundColor
);
sessionStorage.setItem('color', document.body.style.color);
}
Kto pamięta co zrobić, żeby kliknięcie w przycisk uruchomiło naszą funkcję? Ręka do góry!
document
.querySelector('#save')
.addEventListener('click', saveColors);
Dodajmy ten kod poniżej naszej funkcji i sprawdźmy...
No dobrze, ale jak właściwie sprawdzić, czy coś się wydarzyło?
Otwórzmy narzędzia programisty i zajrzyjmy do zakładki Aplikacja
Skoro potrafimy już zapisać dane, to nic nas nie jest w stanie powstrzymać przed ich odczytaniem!
Celem naszego drugiego zadania będzie odczytanie po naciśnięciu przycisku Restore
kolorów zapisanych w localStorage i sessionStorage oraz ustawienie ich jako aktualnych na stronie.
Spróbujmy napisać funkcję restoreColors, która realizuje drugie zadanie!
Czy możemy wykorzystać istniejący już kod?
Gotowe?
Wyszło nam pewnie coś takiego:
function restoreColors() {
const bgColor = localStorage.getItem('backgroundColor');
const fgColor = sessionStorage.getItem('color');
setBackground(bgColor);
setForeground(fgColor);
}
Prawda, że łatwo się pisze, jak możemy wykorzystać istniejący kod?!
Pozostało nam tylko połączenie funkcji restoreColors ze zdarzeniem kliknięcia na przycisk Restore
document
.querySelector('#restore')
.addEventListener('click', restoreColors);
Dodajmy ten kod poniżej naszej funkcji i sprawdźmy działanie strony.
Save
Restore
.Co zaobserwowałaś?
Save
Restore
Co zaobserwowałaś?
Poniżej ramki z formularzem znajduje się odnośnik, zróbmy z niego użytek!
W nowej zakładce powinien się otworzyć dokument webstoragemonitor.html. Umieśćmy oba dokumenty obok siebie, tak aby były jednocześnie widoczne.
Czas na magię - zmieńmy kolor tła i zapiszmy nową wartość w Web Storage.
Otwórzmy dokument webstoragemonitor.html w naszym ulubionym edytorze i zobaczmy, co tam się dzieje.
Czy wszystko jasne? Nie wygląda to aż tak magicznie ;)
Spróbujmy zrobić jakiś użytek z tego, co widzimy.
Sprawmy, aby strona webstoragemonitor.html zmieniła kolor tła za każdym razem, gdy zmieniamy go i zapisujemy na stronie webstorage.html.
Napiszmy funkcję setStyle, która ustawi kolor tła dokumentu za kadym razem, gdy pojawi się zdarzenie związane z Web Storage.
200kcal później...
function setStyle(ev) {
document.body.style[ev.key] = ev.newValue;
}
window.addEventListener('storage', setStyle);
Zapisujemy różne informacje w przeglądarce i w myśl dyrektywy unijnej powinniśmy poprosić o zgodę,
co niezwłocznie uczynimy.
W tym celu wykorzystamy nieużywany jeszcze element aside na stronie webstorage.html
Zawiera on notyfikację o ciasteczku oraz przycisk do jej zamknięcia.
Jedyny problem jest taki, że ta notyfikacja się nie wyświetla na stronie.
Sprawdźmy dlaczego.
Pomyślmy nad scenariuszem, który powinien być realizowany podczas ładowania strony
Jakie powinniśmy uwzględnić wymagania?
Napiszmy funkcję isCookieSet, która przyjmie nazwę ciasteczka jako jedyny parametr i zwróci wartość logiczną true / false mówiącą o tym, czy ciasteczko o podanej nazwie jest ustawione.
Jedno z możliwych rozwiązań:
function isCookieSet(name) {
const cookies = document.cookie.split('; ');
for (let i = 0; i < cookies.length; i += 1) {
if (cookies[i].startsWith(name + '=')) {
return true;
}
}
return false;
}
Napiszmy funkcję showCookieNotice, która pokaże element aside oraz połączmy jej działanie z funkcją z kroku pierwszego.
Skorzystamy tu z element.classList i classList.remove()
function showCookieNotice() {
document.querySelector('#cookie-notice').classList.remove('hide');
}
if ( !isCookieSet('accept-cookies') ) {
showCookieNotice();
}
Ten krok podzielimy na dwie niezależne części.
Po pierwsze potrzebujemy funkcji hideCookieNotice działającej odwrotnie do funkcji z kroku drugiego. Skorzystamy tu z metody classList.add()
function hideCookieNotice() {
document.querySelector('#cookie-notice').classList.add('hide');
}
Po drugie potrzebujemy fukncji, która zapisze ciasteczko w przeglądarce.
Nasza funkcja setCookie powinna przyjmować nazwę ciasteczka, jego wartość i opcjonalnie czas przydatności do spożycia.
Oto jedno z możliwych rozwiązań:
function setCookie(name, value, time) {
let cookie = name + '=' + value;
if (time) {
cookie += '; max-age=' + time;
}
document.cookie = cookie;
}
Pozostaje nam tylko połączenie wszystkich elementów
Na przykład tak:
function acceptCookies() {
hideCookieNotice();
setCookie('accept-cookies', true, 60*60*24*365);
}
document
.querySelector('#cookie-notice-button')
.addEventListener('click', acceptCookies);
Ufff... mamy już wszystkie potrzebne elementy.
Zapisujemy naszą stronę, odświeżamy i patrzymy co się dzieje
Wszystko gra?
Dzięki za wspólnie spędzony czas i do zobaczenia!