Skip to content

Commit 04f7111

Browse files
committed
Review LocalStorage, sessionStorage
1 parent 082f738 commit 04f7111

File tree

2 files changed

+74
-72
lines changed

2 files changed

+74
-72
lines changed
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11

2-
# Autosave a form field
2+
# Autosave di un campo di un form
33

4-
Create a `textarea` field that "autosaves" its value on every change.
4+
Create un campo di `textarea` che "auto salva" il suo contenuto ad ogni cambiamento.
55

6-
So, if the user accidentally closes the page, and opens it again, he'll find his unfinished input at place.
6+
Quindi se l'utente chiude accidentalmente la pagina, e la riapre, troverà il suo input come in precedenza.
77

8-
Like this:
8+
Come nell'esempio:
99

1010
[iframe src="solution" height=120]
Lines changed: 70 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
11
# LocalStorage, sessionStorage
22

3-
Gli oggetti web storage `localStorage` e `sessionStorage` permetto di salvare le coppie key/value nel browser.Ciò che è interessante è che i dati sopravvivono al ricaricamento della pagina (per `sessionStorage`) e anche in seguito a un restart del browser (for `localStorage`). Vedremo come.
3+
Gli oggetti web storage `localStorage` e `sessionStorage` permetto di salvare le coppie key/value nel browser. Ciò che è interessante è che i dati rimangono memorizzati anche in seguito al ricaricamento della pagina (per `sessionStorage`) e anche in seguito a un riavvio del browser (per `localStorage`). Vedremo come.
44

5-
Abbiamo già i cookies. Perché usiamo altri oggetti?
5+
Abbiamo già a disposizione i cookies. Perché usare altri oggetti?
66

77
- Rispetto ai cookies, gli oggetti web storage non vengono inviati al server con ogni richiesta. Per questo motivo, possiamo archiviarne molti di più. La maggior parte dei browser permette almeno 2 megabytes di dati (o più) e possiedono impostazioni per configurare questa scelta.
88
- Inoltre, il server non può manipolare la memorizzazione degli oggetti tramite HTTP headers. Tutto viene fatto in JavaScript.
9-
- l'archiviazione è legata alla sorgete (origin) (domain/protocol/port triplet). Questo perché, protocolli differenti o sottodomini deducono diverse archiviazioni a oggetti e non possono accedere ai dati tra di loro.
9+
- L'archiviazione è legata alla sorgete (origin) (domain/protocol/port triplet). Questo perché, protocolli differenti o sotto domini deducono diverse archiviazioni a oggetti e non possono accedere ai dati tra di loro.
1010

1111
Le due archiviazioni a oggetti propongono stessi metodi e proprietà:
1212

13-
- `setItem(key, value)` -- archivia la coppia key/value.
14-
- `getItem(key)` -- ottiene il valore dalla key.
15-
- `removeItem(key)` -- rimuove la key con il suo value.
16-
- `clear()` -- cancella tutto.
17-
- `key(index)` -- ottieni la key in una posizione data.
18-
- `length` -- il numero di oggetti archiviati.
13+
- `setItem(key, value)`: memorizza la coppia key/value.
14+
- `getItem(key)`: lettura del valore dalla key.
15+
- `removeItem(key)`: rimuove la key, ed il relativo value.
16+
- `clear()`: rimuove tutti gli elementi.
17+
- `key(index)`: lettura della key all'indice `index`.
18+
- `length`: il numero di oggetti archiviati.
1919

2020
Come potete vedere, è simile alla collezione `Map` (`setItem/getItem/removeItem`), mantiene comunque l'ordine degli elementi e permette il loro accesso tramite indice con `key(index)`.
2121

2222
Vediamo come funziona.
2323

2424
## localStorage demo
2525

26-
Le funzioni principali di `localStorage` sono:
26+
Le caratteristiche principali di `localStorage` sono:
2727

2828
- Condivisione tra le tabs e finestre provenienti dalla stessa origine.
2929
- I dati non scadono. Rimangono in seguito a un riavvio del browser o dell'intero sistema operativo.
3030

31-
Per esempio, se usiamo questo codice...
31+
Per esempio, il seguente esempio:
3232

3333
```js run
3434
localStorage.setItem('test', 1);
@@ -40,42 +40,42 @@ localStorage.setItem('test', 1);
4040
alert( localStorage.getItem('test') ); // 1
4141
```
4242

43-
Dobbiamo solo essere nello stesso punto di partenza (domain/port/protocol), l'url di destinazione può essere differente.
43+
Dobbiamo solo essere nello stesso punto di partenza (domain/port/protocol), l'URL di destinazione può essere differente.
4444

45-
Il `localStorage` è condiviso tra tutte le finestre con la stessa provenienza, quindi se impostiamo i dati in una finestra, il cambiamento diventa visibile in un altra scheda.
45+
Il `localStorage` è condiviso tra tutte le finestre con la stessa provenienza, quindi se impostiamo i dati in una finestra, il cambiamento diventa visibile anche nelle altre schede.
4646

47-
## Object-like access
47+
## Accesso in stile oggetto
4848

49-
Possiamo usare un plain object per getting/setting le keys, in questo modo:
49+
Possiamo usare la stessa sintassi di lettura/scrittura degli oggetti per accedere agli elementi, in questo modo:
5050

5151
```js run
52-
// set key
52+
// imposta un nuovo valore
5353
localStorage.test = 2;
5454

55-
// get key
55+
// legge il valore
5656
alert( localStorage.test ); // 2
5757

58-
// remove key
58+
// rimuove il valore
5959
delete localStorage.test;
6060
```
6161

62-
Questo è permetto per ragioni storiche, e principalmente funziona , ma generalmente non è raccomandato, perché:
62+
Questo è permesso per ragioni storiche, e principalmente funziona, ma generalmente non è raccomandato, perché:
6363

64-
1. Se la key è generata dall'utente, può essere qualsiasi cosa,, come `length` o `toString`, o un altro built-in method of `localStorage`. In questo caso `getItem/setItem` funziona normalmente, mentre l'accesso object-like fallisce:
64+
1. Se la key è generata dall'utente, può essere qualsiasi cosa, come `length` o `toString`, o un altro metodo integrato di `localStorage`. In questo caso `getItem/setItem` funziona normalmente, mentre l'accesso in stile oggetto non funziona:
6565
```js run
6666
let key = 'length';
6767
localStorage[key] = 5; // Error, can't assign length
6868
```
6969

70-
2. C'è un evento `storage`, che si attiva quando modifichiamo dati. Questo evento non accade per accessi object-like. Vedremo più avanti nel capitolo.
70+
2. C'è un evento `storage`, che viene emesso quando modifichiamo dati. Questo evento viene per gli accessi in stile oggetto. Vedremo più avanti nel capitolo.
7171
72-
## Looping sulle keys
72+
## Cicli sulle keys
7373
7474
Come abbiamo visto, i metodi forniscono funzionalità get/set/remove. Ma come otteniamo tutti i valori o keys salvate?
7575
76-
Sfortunatamente, gli objects archiviati non sono iterabili.
76+
Sfortunatamente, gli oggetti archiviati non sono iterabili.
7777
78-
Una soluzione sarebbe quella di eseguire un loop su di loro come una matrice:
78+
Una soluzione sarebbe quella di eseguire un loop su di loro come un array:
7979
8080
```js run
8181
for(let i=0; i<localStorage.length; i++) {
@@ -91,11 +91,11 @@ L'iterazione avverrà sulle keys, ma anche sugli outputs di campi associati ad a
9191
```js run
9292
// cattivo esempio
9393
for(let key in localStorage) {
94-
alert(key); // mostra getItem, setItem e altre funzioni built-in
94+
alert(key); // mostra getItem, setItem e altre funzioni integrate
9595
}
9696
```
9797

98-
... dunque dobbiamo filtrare i camp dal prototipo con il controllo `hasOwnProperty`:
98+
... dunque dobbiamo filtrare i campi dal prototype con il controllo `hasOwnProperty`:
9999

100100
```js run
101101
for(let key in localStorage) {
@@ -106,7 +106,7 @@ for(let key in localStorage) {
106106
}
107107
```
108108

109-
...oppure ottieni le keys "proprie" con `Object.keys` e esegui il loop su di loro se necessario:
109+
...oppure possiamo ottenere le keys "proprie" con `Object.keys` ed eseguire il loop su di loro se necessario:
110110

111111
```js run
112112
let keys = Object.keys(localStorage);
@@ -115,21 +115,21 @@ for(let key of keys) {
115115
}
116116
```
117117

118-
Un lavoro extra, poiché `Object.keys` restituisce solo le keys che appartengono all oggetto, ignorando il prototipo.
118+
Un lavoro extra, poiché `Object.keys` restituisce solo le keys che appartengono all oggetto, ignorando il prototype.
119119

120120

121-
## Strings only
121+
## Solo stringhe
122122

123-
Notare che sia key che i value devono essere stringhe.
123+
Da notare che sia key che i value devono essere stringhe.
124124

125-
Se ci fosse un altro tipo di dato,come un numero, o un object, verrebbe automaticamente convertito a stringa :
125+
Se ci fosse un altro tipo di dato, come un numero, o un object, verrebbe automaticamente convertito a stringa:
126126

127127
```js run
128128
sessionStorage.user = {name: "John"};
129129
alert(sessionStorage.user); // [object Object]
130130
```
131131

132-
Possiamo usare `JSON` per archiviare objects:
132+
Possiamo usare `JSON` per archiviare oggetti:
133133

134134
```js run
135135
sessionStorage.user = JSON.stringify({name: "John"});
@@ -139,7 +139,7 @@ let user = JSON.parse( sessionStorage.user );
139139
alert( user.name ); // John
140140
```
141141

142-
inoltre è possibile convertire a stringa l'intero archivio di object, per esempio per motivi di debugging:
142+
Inoltre è possibile convertire a stringa l'intero archivio di oggetti, per esempio per motivi di debugging:
143143
144144
```js run
145145
// aggiunte le opzioni di formattazione a JSON.stringify per rendere object migliore
@@ -154,46 +154,46 @@ L'oggetto `sessionStorage` è usato molto meno spesso del `localStorage`.
154154
Proprietà e metodi sono gli stessi, ma è più limitato:
155155

156156
- La `sessionStorage` esiste solo all'intero della tab del browser corrente.
157-
- Un altra tab con la stessa pagina avrà un archiviazione differente.
158-
-Viene comunque condivisa tra iframes nella stessa tab (assumendo che la loro provenienza sia la stessa).
157+
- Un'altra tab con la stessa pagina avrà un archiviazione differente.
158+
- Viene comunque condivisa tra iframes nella stessa tab (assumendo che la loro provenienza sia la stessa).
159159
- I dati sopravvivono al refresh della pagina, ma non alla chiusura/apertura della tab.
160160

161161
Vediamo come si comporta.
162162

163-
Usa questo codice...
163+
Esegui questo codice...
164164

165165
```js run
166166
sessionStorage.setItem('test', 1);
167167
```
168168

169-
...Poi ricarica la pagina. ora puoi comunque ottenere i dati:
169+
...Poi ricarica la pagina. Pra potrai comunque ottenere i dati:
170170

171171
```js run
172-
alert( sessionStorage.getItem('test') ); // after refresh: 1
172+
alert( sessionStorage.getItem('test') ); // dopo il refresh: 1
173173
```
174174

175-
...Ma se apri la stessa pagina in un'altra tab, e provi di nuovo, dal codice otterrai `null`, Significa "non è stato trovato nulla".
175+
...Ma se apri la stessa pagina in un'altra tab, e provi di nuovo, dal codice otterrai `null`, ovvero "non è stato trovato nulla".
176176
177177
Questo perché `sessionStorage` è legato non solo all'origine, ma anche alla tab del browser. Per questo motivo, `sessionStorage` è usato sporadicamente.
178178

179-
## Storage event
179+
## Evento di storage
180180

181-
Quando i dati vengono aggiornati in `localStorage` o `sessionStorage`, [storage](https://www.w3.org/TR/webstorage/#the-storage-event)un evento si attiva, con le seguenti proprietà:
181+
Quando i dati vengono aggiornati in `localStorage` o `sessionStorage`, un evento di [storage](https://www.w3.org/TR/webstorage/#the-storage-event) viene emesso, con le seguenti proprietà:
182182

183-
- `key`La key che è stata cambiata (`null` if `.clear()` is called).
184-
- `oldValue`Il vecchio valore (`null` if the key is newly added).
185-
- `newValue`il nuovo valore (`null` if the key is removed).
186-
- `url` – L'url del documento in cui è avvenuto l'aggiornamento.
187-
- `storageArea` – o `localStorage` o `sessionStorage` object in cui è avvenuto l'aggiornamento.
183+
- `key`: La key che è stata modificata (`null` se è stato invocato `.clear()`).
184+
- `oldValue`: Il vecchio valore (`null` se la chiave è nuova).
185+
- `newValue`: il nuovo valore (`null` se la chiave è sta rimossa).
186+
- `URL`: L'URL del documento in cui è avvenuto l'aggiornamento.
187+
- `storageArea`: se l'aggiornamento è avvenuto in `localStorage` o `sessionStorage`.
188188
189-
La cosa importante è: l'evento si attiva in tutti gli objects `window` dove l'archivio è accessibile, ad eccezione per quello in cui è stato causato.
189+
La cosa importante è: l'evento si attiva in tutti gli oggetti `window` dove l'archivio è accessibile, ad eccezione per quello in cui è stato causato.
190190
191191
Elaboriamo.
192192
193-
Immaginate di avere due finestre aperte con lo stesso sito all'interno.Quindi `localStorage` è condiviso tra le due.
193+
Immaginate di avere due finestre aperte con lo stesso sito all'interno. Quindi `localStorage` è condiviso tra le due.
194194

195195
```online
196-
dovresti aprire questa pagina in due browser per testare il seguente codice.
196+
Dovresti aprire questa pagina in due browser per testare il seguente codice.
197197
```
198198

199199
Se entrambe le finestre sono connesse a `window.onstorage`, allora reagiranno agli aggiornamenti che accadono in una delle due.
@@ -202,20 +202,22 @@ Se entrambe le finestre sono connesse a `window.onstorage`, allora reagiranno ag
202202
// attiva un aggiornamento fatto dallo stesso archivio degli altri documenti
203203
window.onstorage = event => { // identico a window.addEventListener('storage', event => {
204204
if (event.key != 'now') return;
205-
alert(event.key + ':' + event.newValue + " at " + event.url);
205+
alert(event.key + ':' + event.newValue + " at " + event.URL);
206206
};
207207
208208
localStorage.setItem('now', Date.now());
209209
```
210210

211-
Notare che l'evento contiene: `event.url` -- l'url del documento in cui i dati sono stati aggiornati.
212-
Inoltre, `event.storageArea` contiene lo storage object -- l'evento è lo stesso per entrambi `sessionStorage` e `localStorage`, quindi `event.storageArea` si rivolge a quello che è stato modificato. Potremmo anche impostare qualcosa all'interno, per "rispondere" al cambiamento.**That allows different windows from the same origin to exchange messages.**
211+
Notare che l'evento contiene: `event.URL` -- l'URL del documento in cui i dati sono stati aggiornati.
212+
Inoltre, `event.storageArea` contiene lo storage object -- l'evento è lo stesso per entrambi `sessionStorage` e `localStorage`, quindi `event.storageArea` si rivolge a quello che è stato modificato. Potremmo anche impostare qualcosa all'interno, per "rispondere" al cambiamento.
213213

214-
I Browser moderni supportano [Broadcast channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), API speciale per comunicazione inter-finestra provenienti dalla stessa sorgente, possiede molte più funzione ma è meno supportata.Esistono librerie che sostituiscono quella API,basate su `localStorage`, che lo rendono disponibile ovunque.
214+
**That allows different windows from the same origin to exchange messages.**
215215

216-
## Summary
216+
I browser moderni supportano [Broadcast channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), un API speciale per comunicazione inter-finestra provenienti dalla stessa sorgente, possiede molte più funzionalità ma è meno supportata. Esistono librerie che sostituiscono quella API, basate su `localStorage`, che lo rendono disponibile ovunque.
217217

218-
Web storage objects `localStorage` e `sessionStorage` permettono di archiviare key/value nel browser.
218+
## Riepilogo
219+
220+
Gli oggetti web storage `localStorage` e `sessionStorage` permettono di archiviare key/value nel browser.
219221
- Sia `key` e `value` devono essere stringhe.
220222
- Il limite è 2mb+, dipende dal browser.
221223
- Non scadono.
@@ -224,21 +226,21 @@ Web storage objects `localStorage` e `sessionStorage` permettono di archiviare k
224226
| `localStorage` | `sessionStorage` |
225227
|----------------|------------------|
226228
| Condivise tra tutte le tabs e finestre provenienti dalla stessa sorgente| Visibile all'interno di una tab del browser, incluso iframes della stessa origine |
227-
| sopravvivono al riavvio del browser | sopravvivono al refresh della pagina (ma non alla chiusura della tab) |
229+
| Sopravvivono al riavvio del browser | Sopravvivono al refresh della pagina (ma non alla chiusura della tab) |
228230
229231
API:
230232
231-
- `setItem(key, value)` -- archivia coppia key/value .
232-
- `getItem(key)` -- ottieni il valore dalla chiave.
233-
- `removeItem(key)` -- rimuovi la chiave con il suo valore.
234-
- `clear()` -- cancella tutto.
235-
- `key(index)` -- ottieni il numero della key `index`.
236-
- `length` -- il numero di oggetti archiviati.
237-
- Use `Object.keys` ottieni tutte le chiavi.
238-
- accediamo alle keys come proprietà degli object, in questo caso un evento `storage` non viene attivato.
233+
- `setItem(key, value)`: archivia coppia key/value .
234+
- `getItem(key)`: legge il valore dalla chiave.
235+
- `removeItem(key)`: rimuove la chiave con il suo valore.
236+
- `clear()`: cancella tutto.
237+
- `key(index)`: legge il valore all'indice `index`.
238+
- `length`: il numero di oggetti archiviati.
239+
- Utilizza `Object.keys` per ottenere tutte le chiavi.
240+
- Accediamo alle keys come proprietà degli oggetti, in questo caso l'evento `storage` non verrà emesso.
239241
240-
Storage event:
242+
Evento di storage:
241243
242-
- attivato su chiamata di `setItem`, `removeItem`, `clear` .
243-
- COntiene tutti i data riguardo l'operazione (`key/oldValue/newValue`), il documento `url` e lo storage object `storageArea`.
244-
- Attivato su tutti gli oggetti `window` che hanno accesso all'archivio eccetto quello da cui è stato generato (all'interno di una tab per `sessionStorage`, globalmente per `localStorage`).
244+
- Emesso su chiamata di `setItem`, `removeItem`, `clear` .
245+
- Contiene tutti i data riguardo l'operazione (`key/oldValue/newValue`), il documento `URL` e lo storage object `storageArea`.
246+
- Emesso su tutti gli oggetti `window` che hanno accesso all'archivio eccetto quello da cui è stato generato (all'interno di una tab per `sessionStorage`, globalmente per `localStorage`).

0 commit comments

Comments
 (0)