Pamięć lokalna HTML5, jak wyczyścić. Korzystanie z localStorage na potrzeby JavaScript

Tłumaczenie artykułu: Jak korzystać z pamięci lokalnej dla JavaScript.
Sara Vieira.

Poznanie podstaw programowania JavaScript często zaczyna się od stworzenia prostych aplikacji, takich jak elektroniczny notatnik, w którym rejestrujemy rzeczy i zdarzenia, o których być może zapomnimy. Ale takie aplikacje charakteryzują się jednym problemem - po ponownym załadowaniu strony lista wszystkich pozostawionych wcześniej wpisów znika, czyli aplikacja wraca do stanu pierwotnego.

Istnieje bardzo proste wyjście z tej sytuacji, które polega na wykorzystaniu lokalnego mechanizmu przechowywania localStorage. Z uwagi na to, że localStorage umożliwia nam przechowywanie niezbędnych danych na komputerze użytkownika, lista zaplanowanych zadań i zdarzeń wspomniana powyżej będzie nadal dostępna po przeładowaniu strony, dodatkowo localStorage to zaskakująco bardzo prosty sposób przechowywania danych i uzyskaj do niego dostęp w razie potrzeby.

Co to jest localStorage?

Jest to lokalny mechanizm przechowywania danych będący częścią technologii Web Storage zapewnianej przez specyfikację HTML5. W tej specyfikacji dozwolone są dwie opcje przechowywania danych:

  • Lokalny magazyn: pozwala na zapisywanie informacji bez ograniczeń dotyczących okresów przechowywania. Z tej opcji skorzystamy, ponieważ lista zadań w naszym przykładzie musi być przechowywana na stałe.
  • Korzystanie z sesji: zapewnia bezpieczeństwo danych tylko przez okres jednej sesji, czyli po zamknięciu przez użytkownika zakładki naszej aplikacji i ponownym jej otwarciu, wszystkie informacje niezbędne do dalszego działania aplikacji zostaną usunięte.

Mówiąc najprościej, jedyne, co robi Web Storage, to przechowywanie danych w formularzu nazwany klucz/wartość lokalnie i w przeciwieństwie do dwóch pozostałych metod, z których każda ma swoje wady ( Przechowywanie informacji o sesji wiąże się z wykorzystaniem do tego strony serwera, ponadto po zamknięciu sesji użytkownika informacja ta jest usuwana, a pliki cookies, choć do przechowywania wykorzystują stronę klienta, nie są niezawodne, ponieważ użytkownik może zrezygnować z ich obsługi poprzez ustawienia przeglądarki. ) zapisuje dane nawet w tym przypadku, jeśli zamknąłeś przeglądarkę lub wyłączyłeś komputer. ( *Pozwoliłem sobie na nieznaczną zmianę i uzupełnienie treści tego akapitu, gdyż uważam, że autor popełnił nieścisłości w oryginale.)

HTML

Jeśli pozostaniemy przy naszym przykładzie, w którym chcemy stworzyć elektroniczną wersję notatnika, to poniżej znajdują się wszystkie niezbędne komponenty do jego realizacji:

  • Pole do wprowadzania nowych wpisów (zdarzenia, zadania itp.).
  • Przycisk potwierdzający wprowadzony wpis.
  • Przycisk umożliwiający wyczyszczenie już utworzonej listy rzeczy do zrobienia.
  • Lista nieuporządkowana, która będzie uzupełniana o elementy w postaci nowych wpisów.
  • Na koniec potrzebujemy elementu div jako kontenera zawierającego komunikaty, które będą wyświetlane użytkownikowi, na przykład ostrzeżenie, że zapomniał wpisać wartość kolejnego wpisu, pozostawiając pole wejściowe puste.

W rezultacie nasz znacznik powinien wyglądać mniej więcej tak:








Jest to całkowicie standardowy szablon HTML, który możemy wypełnić dynamicznie generowaną treścią za pomocą JavaScript.

JavaScript

Biorąc pod uwagę strukturę prostej aplikacji notatnika w naszym przykładzie, pierwszą rzeczą, którą musimy zrobić, to zapewnić śledzenie zdarzenia kliknięcia przycisku "Dodaj notatkę" i sprawdź, czy w polu tekstowym wpisu nie została wpisana jakakolwiek informacja, czyli w momencie naciśnięcia przycisku nie powinna być ona pusta. Coś takiego:

$("#dodaj").click(funkcja() (
//jeśli pole tekstowe jest puste
$("#alarm").html(" Uwaga! Wpisz wpis w formie tekstowej
pole.");
zwróć fałsz;
}

To właśnie robimy z tym fragmentem kodu. Po naciśnięciu przycisku "Dodaj notatkę" sprawdzamy, czy użytkownik wprowadził coś w nowym polu wprowadzania. Jeżeli tego nie zrobił to pojawi się element div, który udostępniliśmy do wyświetlania komunikatów informując użytkownika, że ​​pole wprowadzania wpisu nie jest wypełnione, a następnie po 1000ms (1 sekunda) element div i odpowiednio komunikat, znika. Funkcja następnie zwraca false , po czym przeglądarka przestaje wykonywać resztę skryptu, a aplikacja jest ponownie gotowa do wprowadzenia nowego wpisu.

Kolejnym naszym krokiem będzie dodanie wartości wpisanej w polu wejściowym na początek listy poprzez wygenerowanie nowego elementu listy. Dzięki temu, gdy użytkownik doda kolejny wpis, będzie on zawsze umieszczony na początku listy planowanych zadań i oczekiwanych zdarzeń. Następnie pozostaje nam już tylko zapisać listę za pomocą mechanizmu localStorage:

// Dodaj wpis do istniejącej listy
$("#do zrobienia").prepend("

  • „+Opis+”
  • ");
    // Wyczyść pole wejściowe
    $("#formularz").reset();

    zwróć fałsz;
    });

    Jak zapewne zauważyłeś, nie ma tu nic niezwykłego, używana jest standardowa wersja kodu jQuery. Gdy uzyskujemy dostęp do obiektu localStorage, musimy określić dane, które przechowujemy, w formie klucza/wartości. Możesz użyć dowolnej nazwy klucza i ja ją nazwałem „wszystko”, to musimy wskazać, co tak naprawdę potrzebujemy przechowywać w pamięci. W tym przypadku jest to kompletny fragment znacznika HTML zawarty na nieuporządkowanej liście (znajdującej się pomiędzy tagami), za pomocą której wyświetlane są wszystkie wpisy wprowadzone wcześniej przez użytkownika. Z kodu widać, że po prostu pobieramy potrzebny nam fragment metodą jQuery .html() i na koniec po wykonaniu wszystkich niezbędnych czynności ustawiamy wartość zwracaną funkcji na false , co uniemożliwia przesłanie danych z formularza przed przesłaniem i tym samym ponownym załadowaniem naszej strony.

    Załóżmy teraz, że nasz użytkownik dokonał już kilku wpisów i dla dalszego normalnego działania aplikacji musimy sprawdzić, czy localStorage zawiera informacje zapisane wcześniej na komputerze i jeśli tak, wyświetlić je użytkownikowi. Ponieważ nasza nazwa klucza to „todos”, powinniśmy sprawdzić jego istnienie w następujący sposób:

    // jeśli w pamięci lokalnej znajdują się już dane, wyświetl je

    }

    Aby sprawdzić dostępność danych, używaliśmy zwykłej instrukcji if i jeśli określony przez nas warunek został spełniony, po prostu pobieraliśmy wszystkie dane z pamięci lokalnej, umieszczając je jako znaczniki HTML na nieuporządkowanej liście, która wyświetla wpisy wcześniej wprowadzone przez użytkownik.

    Jeśli sprawdzisz działanie swojej prostej aplikacji, przekonasz się, że po ponownym załadowaniu strony wszystko pozostaje na swoim miejscu. I teraz ostatnią rzeczą, którą musimy zrobić, to stworzyć funkcję, za pomocą której użytkownik w razie potrzeby będzie mógł usunąć wszystkie swoje wpisy. Jest to realizowane poprzez wyczyszczenie localStorage i ponowne załadowanie strony w celu aktywowania wprowadzonych zmian. Następnie podobnie jak w poprzednim przypadku jako wartość zwracaną przez funkcję ustawiamy false, co zapobiega pojawieniu się hasha w adresie URL. ( *i nie przewija strony w górę.):

    // Całkowite oczyszczenie localStorage
    okno.localStorage.clear();
    lokalizacja.przeładuj();
    zwróć fałsz;
    });

    W rezultacie mamy w pełni funkcjonalną aplikację. A składając wszystkie powyższe fragmenty w całość otrzymamy kompletny kod aplikacji:

    $("#dodaj").click(funkcja() (
    var Opis = $("#opis").val();
    if($("#opis").val() == "") (
    $("#alarm").html(" Uwaga! Wprowadź wpis w
    pole tekstowe.");
    $("#alert").fadeIn().delay(1000).fadeOut();
    zwróć fałsz;
    }
    $("#do zrobienia").prepend("

  • "
    + Opis + "
  • ");
    $("#formularz").reset();
    var todos = $("#todos").html();
    localStorage.setItem("do zrobienia", do zrobienia);
    zwróć fałsz;
    });

    if(localStorage.getItem("todos")) (
    $("#todos").html(localStorage.getItem("todos"));
    }

    $("#wyczyść").click(funkcja() (
    okno.localStorage.clear();
    lokalizacja.przeładuj();
    zwróć fałsz;
    });

    Obsługa przeglądarki.

    Specyfikacja HTML5 zapewnia dość potężne wsparcie dla technologii Web Storage, dzięki czemu jest implementowana także przez większość popularnych przeglądarek, nawet IE8. Jedynym problemem pozostaje IE7, jeśli nadal jesteś zainteresowany.

    Wniosek.

    W tak małych aplikacjach mechanizm localStorage może z powodzeniem zastąpić wykorzystanie baz danych. Aby przechowywać niewielkie ilości danych, nie jest konieczne stosowanie bardziej złożonych alternatyw.

    *Nota tłumacza.

    Wyświetlenia wpisu: 475

    Wysłałem Ci artykuł z historią o HTML5 LocalStorage w przeglądarkach. Oddajemy mu głos.

    Starałem się napisać najprostszy i najbardziej zrozumiały poradnik korzystania z technologii localStorage. Artykuł okazał się dość krótki, ponieważ sama technologia i sposoby pracy z nią nie są skomplikowane. Aby zacząć, wystarczy znać trochę JavaScript. Poświęć zatem 10 minut na ten artykuł i możesz bezpiecznie dodać do swojego CV wiersz „Potrafię pracować z localStorage”.

    Co to jest localStorage?

    Tak wygląda obiekt JavaScript:

    Var myCar = ( koła: 4, drzwi: 4, silnik: 1, nazwa: „Jaguar”)

    A tak wygląda JSON. Prawie tak samo jak zwykły obiekt js, tylko wszystkie właściwości muszą być ujęte w cudzysłów.

    ( "firstName": "Iwan", "nazwisko": "Iwanow", "adres": ( "streetAddress": "Moskovskoe sh., 101, m. 101", "miasto": "Leningrad", "kod pocztowy": 101101 ), "Numery telefonu": [ "812 123-1234", "916 123-4567" ] )

    Aby zrozumieć, czym jest localStorage, wyobraź sobie, że masz wbudowany w przeglądarkę taki obiekt, z którego możemy skorzystać. Jednocześnie obiekt ten nie czyści wartości, które tam zapiszemy, jeśli ponownie załadujemy stronę lub nawet całkowicie zamkniemy przeglądarkę.

    W języku JavaScript localStorage jest właściwością globalnego obiektu przeglądarki (okna). Można uzyskać do niego dostęp jako window.localStorage lub po prostu localStorage.

    Warto również powiedzieć, że przeglądarka ma klon localStorage o nazwie sessionStorage. Jedyna różnica polega na tym, że ta ostatnia przechowuje dane tylko dla jednej zakładki (sesji) i po prostu wyczyści jej miejsce, gdy tylko zamkniemy zakładkę

    Przyjrzyjmy się temu na żywo. Na przykład w Google Chrome musisz otworzyć DevTools (F12), przejść do zakładki „Zasoby”, a w lewym okienku zobaczysz localStorage dla tej domeny i wszystkie wartości, które ona zawiera.

    Przy okazji, powinieneś wiedzieć, jak localStorage współpracuje z domenami. Dla każdej domeny Twoja przeglądarka tworzy własny obiekt localStorage i można go edytować lub przeglądać tylko w tej domenie. Na przykład domena mydomain-1.com nie może uzyskać dostępu do localStorage Twojej mydomain-2.com .

    Dlaczego potrzebuję localStorage?

    LocalStorage jest potrzebny tylko do jednego - do przechowywania określonych danych pomiędzy sesjami użytkowników. Możesz wymyślić tysiąc rzeczy, które można przechowywać w lokalnej pamięci przeglądarki. Na przykład gry przeglądarkowe, które wykorzystują go jako plik zapisu lub rejestrują moment, w którym użytkownik zatrzymał się podczas oglądania wideo, różne dane do formularzy itp.

    Jak rozpocząć korzystanie z localStorage?

    Bardzo prosta.

    Praca z localStorage jest bardzo podobna do pracy z obiektami w JavaScript. Istnieje kilka metod pracy z nim.

    localStorage.setItem("klucz", "wartość")

    Metoda, która dodaje nowy klucz z wartością do localStorage (a jeśli taki klucz już istnieje, to nadpisuje go nową wartością). Piszemy na przykład localStorage.setItem('myKey', 'myValue');

    localStorage.getItem("klucz")

    Pobieramy określoną wartość z magazynu kluczy.

    localStorage.removeItem("Klucz")

    Wyjmowanie klucza

    localStorage.clear()

    Czyszczenie całej pamięci

    Teraz możesz otworzyć w przeglądarce zakładkę localStorage i samodzielnie poćwiczyć rejestrowanie i odzyskiwanie danych z tego magazynu. Jeśli coś się stanie, zapiszemy cały kod w pliku js.

    //Dodaj lub zmień wartość: localStorage.setItem("myKey", "myValue"); //teraz masz klucz „myKey” o wartości „myValue” przechowywany w localStorage //Wypisz go na konsoli: var localValue = localStorage.getItem("myKey"); konsola.log(wartośćlokalna); //"mojaWartość" //usuń: localStorage.removeItem("myKey"); //wyczyść całą pamięć localStorage.clear() To samo, tylko z nawiasami kwadratowymi: localStorage["Key"] = "Value" //ustawienie wartości localStorage["Key"] //Pobranie wartości usuń localStorage[" Klucz"] // Usuń wartość

    Chciałbym również zauważyć, że localStorage świetnie współpracuje ze strukturami zagnieżdżonymi, na przykład obiektami.

    //utwórz obiekt var obj = ( pozycja1: 1, pozycja2: , pozycja3:"cześć" ); var serialObj = JSON.stringify(obj); //serializuj go localStorage.setItem("myKey", serialObj); //zapisz go w pamięci za pomocą klucza „myKey” var returnObj = JSON.parse(localStorage.getItem("myKey")) //przeanalizuj go ponownie jako obiekt

    Powinieneś także wiedzieć, że przeglądarki przydzielają 5MB na localStorage. A jeśli go przekroczysz, otrzymasz wyjątek QUOTA_EXCEEDED_ERR. Przy okazji możesz za jego pomocą sprawdzić, czy w Twojej pamięci jest jeszcze miejsce.

    Spróbuj ( localStorage.setItem("klucz", "wartość"); ) catch (e) ( if (e == QUOTA_EXCEEDED_ERR) ( alert("Przekroczono limit"); ) )

    Zamiast wniosków

    Chciałbym, żeby deweloperzy z tego krótkiego artykułu wyciągnęli prosty wniosek, że tę technologię można już w pełni wykorzystać w swoich projektach. Ma dobrą standaryzację i doskonałe wsparcie, które rozwija się dopiero z czasem.

    Bardzo często pierwszą aplikacją JavaScript jest lista Todo, jednak problem z takimi aplikacjami polega na tym, że po odświeżeniu strony wszystkie elementy listy znikają.

    Prostym rozwiązaniem tego problemu jest użycie Lokalny magazyn(Lokalny magazyn). Pamięć lokalna umożliwia przechowywanie danych na komputerze użytkownika i łatwe pobranie z niego listy po odświeżeniu strony. W tym artykule napiszemy małą listę rzeczy do zrobienia, korzystając z pamięci lokalnej.

    Co to jest pamięć lokalna?

    Pamięć lokalna („pamięć internetowa”) była pierwotnie częścią specyfikacji HTML5, ale obecnie została przeniesiona do osobnej specyfikacji. Istnieją dwa sposoby przechowywania danych:

    • Lokalny magazyn: pamięć trwała, tego będziemy używać.
    • Przechowywanie sesji: przechowuje dane tylko dla tej sesji, jeśli użytkownik zamknie stronę, dane zostaną utracone.

    Local Storage umożliwia przechowywanie danych w postaci par klucz-wartość na komputerze użytkownika, a dane te będą dostępne nawet po zamknięciu przeglądarki lub wyłączeniu komputera.

    HTML

    Aby stworzyć listę rzeczy do zrobienia potrzebujemy:

    • Wprowadzanie tekstu umożliwiające wprowadzenie zawartości elementu.
    • Przycisk umożliwiający dodanie pozycji do listy.
    • Przycisk umożliwiający wyczyszczenie listy.
    • Sama lista (
        ).
      • I dodatkowy div pokazujący błędy.

      Zatem znacznik HTML będzie wyglądał następująco:

      Dość prosta struktura, którą ożywimy za pomocą JavaScript.

      Ponieważ używamy jQuery, musimy go dodatkowo podłączyć.

      JavaScript

      Najpierw musimy prześledzić kliknięcie przycisku dodawania i sprawdzić, czy pole wejściowe nie jest puste:

      $("#add").click(funkcja() ( var Opis = $("#opis").val(); if($("#opis").val() == "") ( $( "#alarm").html(" Ostrzeżenie! Zostawiłeś zadanie do wykonania puste"); $("#alert").fadeIn().delay(1000).fadeOut(); return false; )

      Ten kod sprawdza wartość wprowadzonego tekstu i jeśli jest pusta, wyświetla błąd i zwraca wartość false, dzięki czemu reszta kodu nie zostanie wykonana, a element nie zostanie dodany do listy.

      // wstaw wpis $("#todos").prepend("

    • „+Opis+”
    • "); // usuń wszystko, co pozostało w polu tekstowym $("#form").reset(); var todos = $("#todos").html(); localStorage.setItem("todos", todos ); zwróć fałsz; ));

      Aby pracować z pamięcią lokalną, musisz podać klucz i odpowiadającą mu wartość. W naszym przypadku nazwijmy klucz „todos”, a wartością będzie cały kod HTML zawarty na liście (w tagu

        ). Ten kod można łatwo uzyskać za pomocą jQuery. Na koniec zwracamy false, aby zapobiec przesłaniu formularza i ponownemu załadowaniu strony.

        Następnym krokiem jest sprawdzenie pamięci lokalnej, jeśli jest tam wartość z kluczem „todos”, to załaduj listę z pamięci lokalnej:

        If (localStorage.getItem("todos")) ( $("#todos").html(localStorage.getItem("todos")); )

        Ponieważ przechowujemy gotowy kod HTML w magazynie, a następnie po prostu wstawiamy ten kod na listę.

        Nasza lista rzeczy do zrobienia jest prawie gotowa, pozostaje tylko wdrożyć funkcję czyszczenia listy. Gdy użytkownik kliknie przycisk, cała lista zostanie usunięta, a pamięć lokalna zostanie wyczyszczona:

        $("#clear").click(function() ( window.localStorage.clear(); lokalizacja.reload(); return false; ));

        Gotowy! Kompletny kod wygląda następująco:

        $(dokument).ready(function() ( $("#add").click(function() ( var Opis = $("#opis").val(); if ($("#opis"). val() == "") ( $("#alert").html(" Ostrzeżenie! Zostawiłeś zadanie do wykonania puste"); $("#alert").fadeIn().delay(1000).fadeOut(); return false; ) $("#todos").prepend("

      • „+Opis+”
      • "); $("#form").reset(); var todos = $("#todos").html(); localStorage.setItem("zadania", zadania); return false; )); if (localStorage .getItem("todos")) ( $("#todos").html(localStorage.getItem("todos")); ) $("#clear").click(function() ( window.localStorage.clear( ); lokalizacja.reload(); return false; )); ));

        Obsługa przeglądarki

        Pamięć internetowa jest obsługiwana przez wszystkie główne przeglądarki, nawet IE8. Powinieneś uważać tylko na IE7 i starsze.

        Wniosek

        Lokalna pamięć masowa w tak małych aplikacjach może być doskonałym zamiennikiem bazy danych. Przechowywanie małych ilości informacji nie powinno być trudne.

        Tworzenie aplikacji z listą rzeczy do zrobienia jest zwykle pierwszą aplikacją, którą tworzysz podczas nauki JavaScript, ale problem ze wszystkimi tymi aplikacjami polega na tym, że po ponownym załadowaniu strony wszystkie te listy znikają.
        Jest proste rozwiązanie - wykorzystanie pamięci lokalnej. Zaletą magazynu lokalnego jest to, że możesz przechowywać fragmenty danych na komputerze użytkownika, a po ponownym załadowaniu strony wszystkie listy zadań nadal tam są.

        Co to jest pamięć lokalna?

        Lokalne przechowywanie danych jest częścią sieci pamięci masowej, która sama w sobie jest częścią specyfikacji HTML5. Istnieją dwie możliwości przechowywania danych w specyfikacji:

        • Magazyn lokalny: przechowuje dane bez daty ważności i jest to opcja, której będziemy używać, ponieważ chcemy, aby nasze wpisy pozostawały na stronie tak długo, jak to możliwe.
        • Przechowywanie sesji: przechowuje dane tylko dla jednej sesji, więc jeśli użytkownik zamknie kartę i otworzy ją ponownie, wszystkie jego dane zostaną utracone.

        Mówiąc najprościej, cała pamięć internetowa przechowuje lokalnie pary klucz/wartość z nazwą i w przeciwieństwie do plików cookie dane te są zapisywane nawet po zamknięciu przeglądarki lub wyłączeniu komputera.

        Jeśli pomyślimy o liście rzeczy do zrobienia, będziesz potrzebować:

        • Strefa wejściowa, gdzie możesz umieścić naszą listę
        • Przycisk Enter, aby dodać listę
        • Przycisk umożliwiający wyczyszczenie całego dziennika
        • Kontener listy nieuporządkowanej, w którym nasza lista zostanie umieszczona na liście elementów
        • I na koniec potrzebujemy kontenera DIV, który będzie wyświetlał powiadomienie przy próbie wprowadzenia pustego zadania.

        Zatem nasz kod HTML powinien wyglądać mniej więcej tak:

        Jest to dość standardowy kontener HTML, a dzięki naszemu JavaScriptowi możemy wypełnić całość dynamiczną treścią.

        Ponieważ w tym przykładzie będziemy używać JQuery, powinieneś uwzględnić go również w swoim dokumencie HTML.

        JavaScript

        Jeśli myślimy o strukturze prostej aplikacji typu „lista rzeczy do zrobienia”, pierwszą rzeczą, którą musimy zrobić, to sprawdzić, czy dane wejściowe są puste, gdy użytkownik kliknie przycisk „dodaj” lub „zatwierdź”:

        $("#add").click(function() ( var Opis = $("#opis").val(); //jeśli zadanie jest puste if($("#opis").val( ) == "") ( $("#alarm").html(" Ostrzeżenie! Zostawiłeś zadanie do wykonania puste"); $("#alert").fadeIn().delay(1000).fadeOut(); return false; )

        Jedyne, co zrobiliśmy, to przetestowaliśmy kliknięcie przycisku Dodaj i przeprowadziliśmy prosty test, aby sprawdzić, czy użytkownik wprowadził coś do danych wejściowych. Jeśli nie, pojawi się alert div, który będzie wyświetlany przez 1000 ms, a następnie zniknie.

        Następną rzeczą, którą musimy zrobić, to wstawić element listy z wartością do linii wejściowej i będziemy to poprzedzać, aby gdy użytkownik doda zadanie, zawsze trafiało na górę listy, a następnie zapisywał listę element do magazynu lokalnego, w ten sposób:

        // dodaj element listy $("#todos").prepend("

      • „+Opis+”
      • "); // usuń wszystko, co jest na wejściu $("#form").reset(); var todos = $("#todos").html(); localStorage.setItem("todos", todos); return FAŁSZ; ));

        Jak widać, jest to dość standardowe jQuery i jeśli chodzi o pamięć lokalną, musimy przechowywać klucz i wartość. Kluczem jest nazwa, którą sobie nadajemy. W tym przypadku nazwiemy ją po prostu „Todos”. Następnie musimy zdefiniować, co chcemy przechowywać. W tym przypadku będzie to cały kod HTML znajdujący się na nieuporządkowanej liście Todos. Jak widać, przechwyciliśmy wszystko za pomocą jQuery i na koniec zwróciliśmy wartość false, aby formularz nie zawiódł, a nasza strona nie została odświeżona.

        Następnym krokiem jest sprawdzenie, czy mamy coś zapisanego w pamięci lokalnej. Jeśli tak, to musimy umieścić go na stronie, biorąc pod uwagę, że nadaliśmy naszemu kluczowi nazwę „todos”, musimy sprawdzić, czy istnieje. Lubię to:

        // jeśli mamy coś w lokalnym magazynie, to if(localStorage.getItem("todos")) ( $("#todos").html(localStorage.getItem("todos")); )

        Jeśli przetestujesz naszą aplikację i ponownie załadujesz stronę, zobaczysz, że już działa. Wystarczy, że stworzymy funkcję, która będzie odpowiedzialna za wyczyszczenie całej listy. Usuwamy całą pamięć lokalną, ponownie ładujemy stronę, aby nasza zmiana zaczęła obowiązywać, a następnie zwracamy wartość „false”, aby zapobiec hashowi przed adresem URL w następujący sposób:

        // wyczyść całą pamięć lokalną $("#clear").click(function() ( window.localStorage.clear(); lokalizacja.reload(); return false; ));

        Kompletny kod wygląda następująco:

        $("#add").click(funkcja() ( var Opis = $("#opis").val(); if($("#opis").val() == "") ( $( "#alarm").html(" Ostrzeżenie! Zostawiłeś zadanie do wykonania puste"); $("#alert").fadeIn().delay(1000).fadeOut(); return false; ) $("#todos").prepend("

      • „+Opis+”
      • "); $("#form").reset(); var todos = $("#todos").html(); localStorage.setItem("zadania", zadania); return false; )); if(localStorage .getItem("todos")) ( $("#todos").html(localStorage.getItem("todos")); ) $("#clear").click(function() ( window.localStorage.clear( ); lokalizacja.reload(); return false; ));

        Obsługa przeglądarki

        Obsługa pamięci masowej w sieci Web jest całkiem dobra dla specyfikacji HTML5, jest obsługiwana przez wszystkie główne przeglądarki, a nawet IE8.

        Tłumaczenie: Wład Merzhevich

        Trwała pamięć lokalna to obszar, w którym aplikacje klienckie mają przewagę nad aplikacjami serwerowymi. Aplikacje takie jak system operacyjny zapewniają warstwę abstrakcji do przechowywania i pobierania danych, takich jak ustawienia lub stan wykonania. Wartości te mogą być przechowywane w rejestrze, plikach INI, plikach XML lub gdzie indziej w zależności od zasad platformy. Jeśli Twoja aplikacja kliencka wymaga lokalnego przechowywania czegoś więcej niż tylko pary klucz/wartość, możesz wstawić własną bazę danych, wymyślić własny format pliku lub dowolną liczbę innych rozwiązań.

        Historycznie rzecz biorąc, aplikacje internetowe nie miały żadnego z tych luksusów. Pliki cookie zostały wynalezione na początku historii Internetu i mogą być wykorzystywane do trwałego lokalnego przechowywania niewielkich ilości danych. Mają jednak trzy potencjalne wady:

        • Pliki cookie są dołączane do każdego żądania HTTP, spowalniając w ten sposób Twoją aplikację internetową poprzez niepotrzebne przesyłanie w kółko tych samych danych;
        • pliki cookie są dołączane do każdego żądania HTTP podczas przesyłania danych przez Internet w formie niezaszyfrowanej (nawet jeśli cała aplikacja internetowa przesyłana jest przez SSL);
        • Pliki cookie są ograniczone do około 4 KB danych - wystarczające, aby spowolnić działanie aplikacji (patrz wyżej), ale nie na tyle, aby były przydatne.

        Oto, czego naprawdę chcemy:

        • dużo miejsca do przechowywania;
        • praca po stronie klienta;
        • uwzględniaj odświeżanie strony;
        • brak wysyłania na serwer.

        Przed HTML5 wszystkie próby osiągnięcia tego ostatecznie kończyły się niepowodzeniem na różne sposoby.

        Krótka historia pamięci lokalnej przed HTML5

        Na początku był tylko jeden Internet Explorer. Przynajmniej tak Microsoft chciał, żeby świat myślał. W tym celu w ramach Pierwszej Wielkiej Wojny Przeglądarkowej Microsoft wynalazł wiele rzeczy i umieścił je w swojej przeglądarce, która zakończyła wojnę, Internet Explorerze. Jedna z tych rzeczy została nazwana Zachowaniami DHTML, a jedno z zachowań nazwano danymi użytkownika.

        UserData umożliwia stronie internetowej przechowywanie do 64 KB danych na domenę w hierarchicznej strukturze przypominającej XML. Zaufane domeny, takie jak witryny intranetowe, mogą przechowywać dziesięć razy więcej. I hej, 640 KB powinno wystarczyć każdemu. Przeglądarka IE nie zapewniła możliwości zmiany tych konwencji, zatem nie ma możliwości zwiększenia ilości dostępnej pamięci.

        W 2002 roku firma Adobe wprowadziła we Flashu 6 funkcję, która nie powiodła się i została błędnie nazwana „Flash Cookies”. W środowisku Flash ta funkcja jest bardziej znana jako lokalne obiekty udostępnione (LSO). Krótko mówiąc, pozwala obiektom Flash przechowywać do 100 KB danych na domenę. Brad Neuberg, który opracował wczesny prototyp pomostu pomiędzy Flashem a JavaScriptem, nazwał go AMASS (AJAX Massive Storage System), ale był ograniczony pewnymi dziwactwami projektu Flash. Do roku 2006, wraz z wprowadzeniem interfejsu zewnętrznego we Flashu 8, dostęp do obiektów LSO poprzez JavaScript stał się o rząd wielkości łatwiejszy i szybszy. Brad przepisał AMASS i zintegrował go z popularnym zestawem narzędzi Dojo pod pseudonimem dojox.storage. Flash daje każdej domenie 100kb przestrzeni dyskowej „za darmo”. Ponadto oferuje użytkownikowi, na żądanie, zwiększenie pojemności pamięci o rząd wielkości (1 MB, 10 MB itp.).

        if (Modernizr.localstorage) (
        // window.localStorage jest dostępny!
        ) w przeciwnym razie (
        // brak natywnej obsługi pamięci HTML5
        }

        Korzystanie z pamięci HTML5

        Pamięć HTML5 opiera się na nazwach par klucz/wartość. Przechowujesz informacje na podstawie nazwy klucza, a następnie możesz odzyskać te dane za pomocą tego samego klucza. Nazwa klucza to ciąg. Dane mogą być dowolnego typu obsługiwanego przez JavaScript, w tym ciągi znaków, wartości logiczne, liczby całkowite lub liczby zmiennoprzecinkowe. Jednak w rzeczywistości dane są przechowywane w postaci ciągu znaków. Jeśli przechowujesz i pobierasz dane inne niż ciągi znaków, będziesz musiał użyć funkcji takich jak parseInt() lub parseFloat(), aby przekonwertować otrzymane dane na prawidłowe typy JavaScript.

        Interfejs pamięci masowej (
        Pobierz przez getItem(key);
        Ustaw za pomocą setItem(key, data);
        };

        Wywołanie setItem() z istniejącą nazwą klucza spowoduje ciche nadpisanie poprzedniej wartości. Wywołanie metody getItem() z nieistniejącym kluczem zwróci NULL zamiast zgłosić wyjątek.

        Podobnie jak inne obiekty JavaScript, dostęp do obiektu localStorage można uzyskać w postaci tablicy asocjacyjnej. Zamiast używać metod getItem() i setItem(), możesz po prostu podać nawiasy kwadratowe. Na przykład ten fragment kodu

        var foo = localStorage.getItem("bar");
        // ...
        localStorage.setItem("pasek", foo);

        można przepisać przy użyciu składni nawiasów kwadratowych:

        var foo = localStorage["pasek"];
        // ...
        localStorage["bar"] = foo;

        Istnieją również metody usuwania wartości według nazwy klucza, a także czyszczenia całego sklepu (czyli usuwania wszystkich kluczy i wartości na raz).

        Interfejs pamięci masowej (
        Usuń poprzez RemoveItem(key);
        jasne();
        }

        Wywołanie metody RemoveItem() z nieistniejącym kluczem nic nie zwróci.

        Wreszcie istnieje właściwość pozwalająca uzyskać całkowitą liczbę wartości w obszarze przechowywania i iterować po wszystkich kluczach według indeksu (pobiera nazwę każdego klucza).

        Interfejs pamięci masowej (
        długość
        Pobierz klucz (nieujemna liczba całkowita);
        }

        Jeśli po wywołaniu key() indeks nie mieści się w zakresie od 0 do (długość-1), funkcja zwróci null .

        Monitorowanie obszaru przechowywania HTML5

        Jeśli chcesz programowo śledzić zmiany w pamięci, musisz przechwycić zdarzenie magazynu. To zdarzenie występuje w obiekcie okna, gdy wywoływane są metody setItem(), RemoveItem() lub clear() i coś zmieniają. Na przykład, jeśli ustawisz istniejącą wartość lub wywołasz metodę clear(), gdy nie ma kluczy, zdarzenie nie zostanie uruchomione, ponieważ obszar przechowywania w rzeczywistości się nie zmienił.

        Zdarzenie Storage jest obsługiwane wszędzie tam, gdzie działa obiekt localStorage, łącznie z Internet Explorerem 8. IE 8 nie obsługuje standardu W3C addEventListener (chociaż zostanie docelowo dodany w IE 9), dlatego aby przechwycić zdarzenie Storage należy sprawdzić, który silnik zdarzeń obsługuje to przeglądarka (jeśli zrobiłeś to już wcześniej w przypadku innych wydarzeń, możesz przejść do końca tej sekcji). Przechwytywanie zdarzenia pamięci działa w taki sam sposób, jak przechwytywanie innych zdarzeń. Jeśli wolisz używać jQuery lub innej biblioteki JavaScript do rejestrowania programów obsługi zdarzeń, możesz to zrobić również za pomocą magazynu.

        if (window.addEventListener) (
        window.addEventListener("pamięć", handle_storage, false);
        ) w przeciwnym razie (
        window.attachEvent("onstorage", handle_storage);
        };

        Wywołanie zwrotne handle_storage zostanie wywołane z obiektem StorageEvent, z wyjątkiem przeglądarki Internet Explorer, gdzie zdarzenia przechowywane są w window.event .

        funkcja handle_storage(e) (
        if (!e) ( e = okno.event; )
        }

        W tym przypadku zmienna e będzie obiektem StorageEvent, który ma następujące przydatne właściwości.

        *Uwaga: właściwość url pierwotnie nosiła nazwę uri i niektóre przeglądarki obsługiwały tę właściwość przed zmianą specyfikacji. Aby zapewnić maksymalną kompatybilność, powinieneś sprawdzić, czy właściwość url istnieje, a jeśli nie, sprawdź zamiast tego właściwość uri.

        Zdarzenia przechowywania nie można anulować i nie ma możliwości zatrzymania zmiany wewnątrz wywołania zwrotnego handle_storage. To po prostu sposób, w jaki przeglądarka informuje Cię: „Hej, to się właśnie wydarzyło. Nic nie możesz zrobić, chciałem tylko, żebyś wiedział.

        Ograniczenia w obecnych przeglądarkach

        Opowiadając o historii lokalnego przechowywania przy użyciu wtyczek innych firm, wspomniałem o ograniczeniach każdej techniki. Przypomniałem sobie, że nie mówiłem nic o ograniczeniach standardowej obecnie pamięci HTML5. Podam Ci odpowiedzi, a następnie je wyjaśnię. Odpowiedzi, w kolejności ważności, to „5 megabajtów”, „QUOTA_EXCEEDED_ERR” i „brak”.

        „5 megabajtów” - domyślnie zapewniana ilość miejsca na dysku. Ta wartość jest zaskakująco spójna we wszystkich przeglądarkach, chociaż jest podana jako nic innego jak sugestia w specyfikacji HTML5. Musisz zrozumieć, że przechowujesz ciągi znaków, a nie dane w oryginalnym formacie. Jeśli przechowujesz wiele liczb całkowitych lub zmiennoprzecinkowych, różnica w reprezentacji może być duża. Każda cyfra liczby zmiennoprzecinkowej jest przechowywana jako znak, a nie w zwykłej reprezentacji takich liczb.

        „QUOTA_EXCEEDED_ERR” to wyjątek, który otrzymasz, jeśli przekroczysz limit 5 MB. „Nie” to odpowiedź na kolejne oczywiste pytanie: „Czy mogę poprosić użytkownika o więcej miejsca na dysku?” W chwili pisania tego tekstu przeglądarki nie implementują żadnego mechanizmu umożliwiającego twórcom stron internetowych żądanie większej ilości miejsca na dysku. Niektóre przeglądarki (takie jak Opera) pozwalają użytkownikowi kontrolować przydziały miejsca na dane dla poszczególnych witryn, ale jest to wyłącznie inicjatywa użytkownika i niezwiązana z niczym, co programista może wbudować w swoją aplikację internetową.

        Pamięć HTML5 w akcji

        Przyjrzyjmy się pamięci HTML5 w akcji. Wróćmy jeszcze raz do tego, który zbudowaliśmy w rozdziale poświęconym rysowaniu. Jest mały problem z tą grą: jeśli zamkniesz okno przeglądarki w środku gry, utracisz wyniki. Ale dzięki pamięci HTML5 możemy zapisać proces gry lokalnie, w samej przeglądarce. Otwórz demo, wykonaj kilka ruchów, zamknij kartę przeglądarki, a następnie otwórz ją ponownie. Jeśli Twoja przeglądarka obsługuje pamięć HTML5, strona demonstracyjna w magiczny sposób zapamięta dokładną pozycję w grze, w tym liczbę wykonanych ruchów, położenie każdego elementu na planszy, a nawet wybranego elementu.

        Jak to działa? Za każdym razem, gdy nastąpi zmiana w grze, wywołamy tę funkcję.

        funkcja saveGameState() (

        localStorage["halma.game.in.progress"] = gGameInProgress;
        dla (var i = 0; tj< kNumPieces; i++) {
        localStorage["halma.piece." + i + ".row"] = gPieces[i].row;
        localStorage["halma.piece." + i + ".column"] = gPieces[i].kolumna;
        }
        localStorage["halma.selectedpiece"] = gSelectedPieceIndex;
        localStorage["halma.selectedpiecehasmoved"] = gSelectedPieceHasMoved;
        localStorage["halma.movecount"] = gMoveCount;
        zwróć wartość true;
        }

        Jak widać obiekt localStorage służy do zapisywania postępu gry (gGameInProgress, typ boolowski). Następnie wszystkie elementy (gPieces, tablica JavaScript) są iterowane, a dla każdego z nich zapisywany jest wiersz i kolumna. Następnie zapisywane są dodatkowe stany gry, w tym wybrany element (gSelectedPieceIndex, liczba całkowita), element znajdujący się w środku długiej serii skoków (gSelectedPieceHasMoved, wartość logiczna) oraz całkowita liczba wykonanych ruchów (gMoveCount, liczba całkowita).

        Kiedy strona się ładuje, zamiast automatycznie wywoływać funkcję newGame(), która przywróciłaby wszystkie zmienne do ich oryginalnych wartości, wywołujemy funkcję CV() . Funkcja CVGame() wykorzystuje pamięć HTML5 do sprawdzania stanu gry w pamięci lokalnej. Jeśli jest obecny, przywraca wartości za pomocą obiektu localStorage.

        funkcja CVGame() (
        if (!supportsLocalStorage()) (zwróć wartość false; )
        gGameInProgress = (localStorage["halma.game.in.progress"] == "true");
        if (!gGameInProgress) (zwróć wartość false; )
        gPieces = nowa tablica(kNumPieces);
        dla (var i = 0; tj< kNumPieces; i++) {
        var row = parseInt(localStorage["halma.piece." + i + ".row"]);
        var kolumna = parseInt(localStorage["halma.piece." + i + ".column"]);
        gPieces[i] = nowa komórka (wiersz, kolumna);
        }
        gNumPieces = kNumPieces;
        gSelectedPieceIndex = parseInt(localStorage["halma.selectedpiece"]);
        gSelectedPieceHasMoved = localStorage["halma.selectedpiecehasmoved"] == "true";
        gMoveCount = parseInt(localStorage["halma.movecount"]);
        tablica rysunkowa();
        zwróć wartość true;
        }

        Najważniejszą częścią tej funkcji jest zastrzeżenie, o którym wspomniałem wcześniej w tym rozdziale i które tutaj powtórzę: dane są przechowywane w postaci ciągów znaków. Jeśli przechowujesz coś innego niż ciągi znaków, będziesz musiał je przekonwertować po ich otrzymaniu. Na przykład flaga wskazująca, że ​​gra jest w toku (gGameInProgress) jest typu logicznego. W funkcji saveGameState() po prostu przechowujemy go i nie przejmujemy się typem danych.

        localStorage["halma.game.in.progress"] = gGameInProgress;

        Jednak w funkcji CVGame() musimy spojrzeć na wartość pobraną z pamięci lokalnej jako ciąg znaków i ręcznie skonstruować własną wartość logiczną.

        gGameInProgress = (localStorage["halma.game.in.progress"] == "true");

        Podobnie liczba ruchów zapisywana jest w gMoveCount jako liczba całkowita, w funkcji saveGameState() po prostu ją zapisujemy.

        localStorage["halma.movecount"] = gMoveCount;

        Jednak w funkcji CV() musimy przekonwertować wartość na liczbę całkowitą, korzystając z wbudowanej w JavaScript funkcji parseInt().

        gMoveCount = parseInt(localStorage["halma.movecount"]);

        Poza parami klucz/wartość: wizja konkurencji

        Chociaż w historii istniało wiele sztuczek i obejść, obecny stan pamięci HTML5 jest zaskakująco zdrowy. Nowe API zostało ujednolicone i uwzględnione we wszystkich głównych przeglądarkach, platformach i urządzeniach. Dla twórcy stron internetowych nie jest to coś, co widzisz na co dzień, prawda? Ale to coś więcej niż tylko „5 megabajtów par klucz/wartość”, a przyszłość trwałej lokalnej pamięci masowej to… jak by to powiedzieć… cóż, powiedzmy, że jest to wizja konkurencyjna.

        Jedna wizja to akronim, który już znasz – SQL. W 2007 roku firma Google uruchomiła Gears, wtyczkę do przeglądarek typu open source, która zawiera wbudowaną bazę danych opartą na SQLite. Ten wczesny prototyp wpłynął później na utworzenie specyfikacji bazy danych Web SQL Database. Baza danych Web SQL (wcześniej znana jako „WebDB”) zapewnia cienką warstwę wokół bazy danych SQL, która umożliwia wykonywanie następujących czynności z poziomu JavaScript:

        openDatabase("dokumenty", "1.0", "Lokalne przechowywanie dokumentów", 5*1024*1024, funkcja (db) (
        db.changeVersion("", "1.0", funkcja (t) (
        t.executeSql("Utwórz dokumenty TABELI (id, nazwa)");
        ), błąd);
        });

        Jak widać większość akcji jest zgodna z metodą ExecuteSQL. Ten ciąg może obsługiwać dowolne polecenie SQL, w tym SELECT, UPDATE, INSERT i DELETE. To tak, jak programowanie baz danych po stronie serwera, z tą różnicą, że robisz to za pomocą JavaScript! O radość!

        Specyfikacja bazy danych Web SQL została zaimplementowana w czterech przeglądarkach i platformach.

        Obsługa baz danych Web SQL
        TJ. Firefoksa Safari Chrom Opera iPhone'a Android
        4.0+ 4.0+ 10.5+ 3.0+ 2.0+

        Oczywiście, jeśli korzystałeś w życiu z więcej niż jednej bazy danych, wiesz, że „SQL” to bardziej termin marketingowy niż twardy i szybki standard (niektórzy mogą powiedzieć to samo o HTML5, ale to nie ma znaczenia) . Oczywiście istnieje aktualna specyfikacja SQL (zwana SQL-92), ale nie ma na świecie serwera baz danych, który byłby zgodny tylko z tą specyfikacją. Istnieje Oracle SQL, Microsoft SQL, SQL w MySQL, SQL w PostgreSQL, SQL w SQLite. Tak naprawdę każdy z tych produktów z czasem dodaje nową funkcjonalność SQL, więc nawet powiedzenie „SQL w SQLite” nie wystarczy. Powinieneś powiedzieć „wersja SQL dołączona do wersji SQLite X.Y.Z”.

        Wszystko to prowadzi nas do kolejnego zastrzeżenia, obecnie zamieszczonego na początku specyfikacji Web SQL.

        Specyfikacja znalazła się w ślepym zaułku: wszyscy zainteresowani programiści korzystają z SQL po stronie serwera (SQLite), ale potrzebujemy wielu niezależnych implementacji, aby przejść w stronę standaryzacji. Podczas gdy inni programiści są zainteresowani wdrożeniem tej specyfikacji, opis dialektu SQL pozostawiono jedynie jako odniesienie do Sqlite, co jest nieakceptowalne dla standardu.

        Na tym tle opowiem Państwu o kolejnej konkurencyjnej wizji zaawansowanej, trwałej lokalnej pamięci masowej dla aplikacji internetowych: Indexed Database API, dawniej znanej jako „WebSimpleDB”, obecnie pieszczotliwie nazywanej IndexedDB.

        Interfejs API Indexed Database zapewnia tak zwaną pamięć obiektową, w której wiele pomysłów zapożyczono z baz danych SQL. Istnieją „bazy danych” z „rekordami”, przy czym każdy rekord ma określoną liczbę „pól”. Każde pole ma określony typ danych, który jest ustalany podczas tworzenia bazy danych. Możesz wybrać podzbiór rekordów, a następnie wyświetlić ich listę za pomocą „kursora”. Zmiany w składnicy obiektów są przetwarzane za pomocą „transakcji”.

        Jeśli kiedykolwiek programowałeś bazy danych SQL, te terminy są prawdopodobnie Ci znane. Główna różnica polega na tym, że pamięć obiektowa nie posiada strukturalnego języka zapytań. Nie piszesz warunku takiego jak „WYBIERZ * od UŻYTKOWNIKÓW, gdzie AKTYWNY = „Y””. Zamiast tego używamy metod udostępnianych przez składnicę obiektów do otwierania bazy danych USERS, wyliczania rekordów, filtrowania rekordów i korzystania z metod dostępu w celu uzyskania wartości każdego pola pozostałych rekordów. Wczesny przegląd IndexedDB jest dobrym tutorialem na temat działania IndexedDB i porównania IndexedDB z Web SQL.

        W chwili pisania tego tekstu IndexedDB zostało zaimplementowane jedynie w wersji beta przeglądarki Firefox 4. Dla kontrastu Mozilla oświadczyła, że ​​nigdy nie wdroży Web SQL. Firma Google oświadczyła, że ​​rozważa obsługę IndexedDB dla Chromium i Google Chrome. Nawet Microsoft stwierdził, że IndexedDB to „świetne rozwiązanie dla sieci”.

        Co możesz zrobić jako programista stron internetowych dzięki IndexedDB? W tej chwili prawie nic poza kilkoma demonstracjami technologii. Za rok? Może.