From bca471026687fca5732848f23c97874dc5b97dec Mon Sep 17 00:00:00 2001 From: perepichai Date: Thu, 11 Jul 2019 22:38:15 +0300 Subject: [PATCH 1/7] update0 --- 6-data-storage/02-localstorage/article.md | 199 +++++++++++----------- 1 file changed, 100 insertions(+), 99 deletions(-) diff --git a/6-data-storage/02-localstorage/article.md b/6-data-storage/02-localstorage/article.md index 2e24affba5..1e84ce7e1e 100644 --- a/6-data-storage/02-localstorage/article.md +++ b/6-data-storage/02-localstorage/article.md @@ -1,83 +1,84 @@ # LocalStorage, sessionStorage -Web storage objects `localStorage` and `sessionStorage` allow to save key/value pairs in the browser. +Объекты веб-хранилища `localStorage` и `sessionStorage` позволяют хранить пары ключ/значение в браузере. -What's interesting about them is that the data survives a page refresh (for `sessionStorage`) and even a full browser restart (for `localStorage`). We'll see that very soon. +Что в них важно - данные, которые в них записаны, сохраняются после обновления страницы (в случае sessionStorage) и даже после перезагрузки браузера (при использовании localStorage). Скоро мы это увидим. -We already have cookies. Why additional objects? +Но ведь у нас уже есть куки. Зачем тогда эти объекты? -- Unlike cookies, web storage objects are not sent to server with each request. Because of that, we can store much more. Most browsers allow at least 2 megabytes of data (or more) and have settings to configure that. -- Also unlike cookies, the server can't manipulate storage objects via HTTP headers. Everything's done in JavaScript. -- The storage is bound to the origin (domain/protocol/port triplet). That is, different protocols or subdomains infer different storage objects, they can't access data from each other. +- В отличие от кук, объекты веб-хранилища не отправляются на сервер при каждом запросе. Поэтому мы можем хранить гораздо больше данных. Большинство браузеров могут сохранить как минимум 2 мегабайта данных (или больше), и этот размер можно поменять в настройках. +- Ещё одно отличие от куки - сервер не может манипулировать объектами хранилища через HTTP-заголовки. Все делается при помощи JavaScript. +- Хранилище привязано к источнику (домен/протокол/порт). Это значит, что разные протоколы или поддомены определяют разные объекты хранилища, и они не могут получить доступ к данным друг друга. -Both storage objects provide same methods and properties: +Объекты хранилища `localStorage` и `sessionStorage` предоставляют одинаковые методы и свойства: -- `setItem(key, value)` -- store key/value pair. -- `getItem(key)` -- get the value by key. -- `removeItem(key)` -- remove the key with its value. -- `clear()` -- delete everything. -- `key(index)` -- get the key on a given position. -- `length` -- the number of stored items. +- `setItem(key, value)` -- сохранить пару ключ/значение (key/value). +- `getItem(key)` -- получить данные по ключу `key`. +- `removeItem(key)` -- удалить данные с ключом `key`. +- `clear()` -- удалить всё. +- `key(index)` -- получить ключ на заданной позиции (index). +- `length` -- количество хранимых пар key/value. -As you can see, it's like a `Map` collection (`setItem/getItem/removeItem`), but also keeps elements order and allows to access by index with `key(index)`. +Как видим, интерфейс похож на `Map` (`setItem/getItem/removeItem`), но также запоминается и порядок элементов, можно получить n-й ключ при помощи `.key(n)`. -Let's see how it works. +Давайте посмотрим, как это работает. -## localStorage demo +## Демо localStorage -The main features of `localStorage` are: +Основные особенности `localStorage`: -- Shared between all tabs and windows from the same origin. -- The data does not expire. It remains after the browser restart and even OS reboot. +- Этот объект один на все вкладки и окна в рамках источника (один и тот же домен/протокол/порт). +- Данные не имеют срока давности, по которому истекают и удаляются. Сохраняются после перезагрузки браузера и даже ОС. -For instance, if you run this code... +Например, если запустить этот код... ```js run localStorage.setItem('test', 1); ``` -...And close/open the browser or just open the same page in a different window, then you can get it like this: +...И закрыть/открыть браузер или открыть ту же страницу в другом окне, то можно получить данные следующим образом: ```js run alert( localStorage.getItem('test') ); // 1 ``` -We only have to be on the same origin (domain/port/protocol), the url path can be different. +Нам достаточно находиться на том же источнике (домен/протокол/порт), при этом URL-путь может быть разным. -The `localStorage` is shared between all windows with the same origin, so if we set the data in one window, the change becomes visible in another one. +Объект `localStorage` разделяется, поэтому, если мы устанавливаем данные в одном окне, изменения становятся видимыми в другом. -## Object-like access -We can also use a plain object way of getting/setting keys, like this: +## Доступ как к обычному объекту + +Также можно получать/записывать данные, как в обычный объект: ```js run -// set key +// установить значение для ключа localStorage.test = 2; -// get key +// получить значение для ключа alert( localStorage.test ); // 2 -// remove key +// удалить ключ и его значение delete localStorage.test; ``` -That's allowed for historical reasons, and mostly works, but generally not recommended for two reasons: +Это возможно по историческим причинам и, как правило, работает, но обычно не рекомендуется по двум причинам: -1. If the key is user-generated, it can be anything, like `length` or `toString`, or another built-in method of `localStorage`. In that case `getItem/setItem` work fine, while object-like access fails: +1. Если ключ генерируется пользователем, то он может быть каким угодно, включая `length` или `toString`, а также другой встроенный метод `localStorage`. В этом случае `getItem/setItem` сработают нормально, а вот чтение/запись как свойства объекта не пройдут: ```js run let key = 'length'; - localStorage[key] = 5; // Error, can't assign length + localStorage[key] = 5; // Ошибка, невозможно установить length ``` -2. There's a `storage` event, it triggers when we modify the data. That event does not happen for object-like access. We'll see that later in this chapter. +2. Когда мы модифицируем данные, то срабатывает событие `storage`. Но это событие не происходит при записи без `setItem`, как свойство обычного объекта. Мы увидим это позже в этой главе. -## Looping over keys +## Перебор ключей -As we've seen, the methods provide "get/set/remove by key" functionality. But how to get all saved values or keys? +Методы, которые мы видим, позволяют читать/писать/удалять данные. А как получить все значения или ключи? -Unfortunately, storage objects are not iterable. +К сожалению, объекты веб-хранилища нельзя перебрать в цикле, они не итерируемы. -One way is to loop over them as over an array: +Но можно пройти по ним как по обычным массивам: ```js run for(let i=0; i { if (event.key != 'now') return; alert(event.key + ':' + event.newValue + " at " + event.url); @@ -210,40 +211,40 @@ window.onstorage = event => { localStorage.setItem('now', Date.now()); ``` -Please note that the event also contains: `event.url` -- the url of the document where the data was updated. +Обратите внимание, что событие также содержит: `event.url` - url-адрес документа, в котором данные обновились. -Also, `event.storageArea` contains the storage object -- the event is the same for both `sessionStorage` and `localStorage`, so `storageArea` references the one that was modified. We may even want to set something back in it, to "respond" to a change. +Также `event.storageArea` содержит объект хранилища - событие одинаковое для `sessionStorage` и `localStorage`, поэтому `storageArea` ссылается на тот, который был изменен. Мы можем захотеть что-то записать в ответ на изменения. -**That allows different windows from the same origin to exchange messages.** +**Это позволяет разным окнам одного источника обмениваться сообщениями.** -Modern browsers also support [Broadcast channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), the special API for same-origin inter-window communication, it's more full featured, but less supported. There are libraries that polyfill that API, based on `localStorage`, that make it available everywhere. +Современные браузеры также поддерживают [Broadcast channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API) специальный API для связи между окнами одного источника, он более полнофункциональный, но менее поддерживаемый. Существуют библиотеки (полифилы), которые эмулируют это API на основе `localStorage` и делают его доступным везде. -## Summary +## Итого -Web storage objects `localStorage` and `sessionStorage` allow to store key/value in the browser. -- Both `key` and `value` must be strings. -- The limit is 2mb+, depends on the browser. -- They do not expire. -- The data is bound to the origin (domain/port/protocol). +Объекты веб-хранилища `localStorage` и `sessionStorage` позволяют хранить пары ключ/значение в браузере. +- `key` и `value` должны быть строками. +- Лимит 2 Мб+, зависит от браузера. +- Они без срока действия. +- Данные привязаны к источнику (домен/протокол/порт). | `localStorage` | `sessionStorage` | |----------------|------------------| -| Shared between all tabs and windows with the same origin | Visible within a browser tab, including iframes from the same origin | -| Survives browser restart | Survives page refresh (but not tab close) | +| Совместно используется между всеми вкладками и окнами с одинаковым источником | Разделяется в рамках вкладки браузера, среди фреймов из того же источника | +| "Переживает" перезапуск браузера | "Переживает" перезагрузку страницы (но не закрытие вкладки) | API: -- `setItem(key, value)` -- store key/value pair. -- `getItem(key)` -- get the value by key. -- `removeItem(key)` -- remove the key with its value. -- `clear()` -- delete everything. -- `key(index)` -- get the key number `index`. -- `length` -- the number of stored items. -- Use `Object.keys` to get all keys. -- We access keys as object properties, in that case `storage` event isn't triggered. +- `setItem(key, value)` -- сохранить пару ключ/значение (key/value). +- `getItem(key)` -- получить данные по ключу `key`. +- `removeItem(key)` -- удалить значение по ключу `key`. +- `clear()` -- удалить всё. +- `key(index)` -- получить ключ на заданной позиции (index). +- `length` -- количество хранимых пар key/value. +- Используйте `Object.keys` для получения всех ключей. +- Можно использовать ключи в качестве свойств объекта, в этом случае событие `storage` не срабатывает. -Storage event: +Событие `storage`: -- Triggers on `setItem`, `removeItem`, `clear` calls. -- Contains all the data about the operation, the document `url` and the storage object. -- Triggers on all `window` objects that have access to the storage except the one that generated it (within a tab for `sessionStorage`, globally for `localStorage`). +- Срабатывает при вызове `setItem`, `removeItem`, `clear`. +- Содержит все данные об операции, `url` документа и объект хранилища. +- Срабатывает на всех объектах `window`, которые имеют доступ к хранилищу, а также там, где оно было сгенерировано (на вкладке для `sessionStorage`, глобально для `localStorage`). From 755974b0a5a8e17e3b0cf69548958d83e1d69825 Mon Sep 17 00:00:00 2001 From: perepichai Date: Sun, 14 Jul 2019 09:46:01 +0300 Subject: [PATCH 2/7] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 6-data-storage/02-localstorage/article.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/6-data-storage/02-localstorage/article.md b/6-data-storage/02-localstorage/article.md index 1e84ce7e1e..1aa435837f 100644 --- a/6-data-storage/02-localstorage/article.md +++ b/6-data-storage/02-localstorage/article.md @@ -2,7 +2,7 @@ Объекты веб-хранилища `localStorage` и `sessionStorage` позволяют хранить пары ключ/значение в браузере. -Что в них важно - данные, которые в них записаны, сохраняются после обновления страницы (в случае sessionStorage) и даже после перезагрузки браузера (при использовании localStorage). Скоро мы это увидим. +Что в них важно - данные, которые в них записаны, сохраняются после обновления страницы (в случае sessionStorage) и даже после перезапуска браузера (при использовании localStorage). Скоро мы это увидим. Но ведь у нас уже есть куки. Зачем тогда эти объекты? @@ -28,7 +28,7 @@ Основные особенности `localStorage`: - Этот объект один на все вкладки и окна в рамках источника (один и тот же домен/протокол/порт). -- Данные не имеют срока давности, по которому истекают и удаляются. Сохраняются после перезагрузки браузера и даже ОС. +- Данные не имеют срока давности, по которому истекают и удаляются. Сохраняются после перезапуска браузера и даже ОС. Например, если запустить этот код... @@ -103,7 +103,7 @@ for(let key in localStorage) { ```js run for(let key in localStorage) { if (!localStorage.hasOwnProperty(key)) { - continue; // пропустит такие ключи как "setItem", "getItem" и так далее + continue; // пропустит такие ключи, как "setItem", "getItem" и так далее } alert(`${key}: ${localStorage.getItem(key)}`); } @@ -158,7 +158,7 @@ alert( JSON.stringify(localStorage, null, 2) ); - `sessionStorage` существует только в рамках текущей вкладки браузера. - Другая вкладка с той же страницей будет иметь другое хранилище. -- Но оно разделяется между фреймами на вкладке (при условии, что они из одного и того же источника). +- Но оно разделяется между ифреймами на вкладке (при условии, что они из одного и того же источника). - Данные продолжают существовать после перезагрузки страницы, но не закрытия/открытия вкладки. Давайте посмотрим на это в действии. @@ -213,7 +213,7 @@ localStorage.setItem('now', Date.now()); Обратите внимание, что событие также содержит: `event.url` - url-адрес документа, в котором данные обновились. -Также `event.storageArea` содержит объект хранилища - событие одинаковое для `sessionStorage` и `localStorage`, поэтому `storageArea` ссылается на тот, который был изменен. Мы можем захотеть что-то записать в ответ на изменения. +Также `event.storageArea` содержит объект хранилища - событие одно и то же для `sessionStorage` и `localStorage`, поэтому `storageArea` ссылается на то хранилище, которое было изменено. Мы можем захотеть что-то записать в ответ на изменения. **Это позволяет разным окнам одного источника обмениваться сообщениями.** @@ -224,26 +224,26 @@ localStorage.setItem('now', Date.now()); Объекты веб-хранилища `localStorage` и `sessionStorage` позволяют хранить пары ключ/значение в браузере. - `key` и `value` должны быть строками. - Лимит 2 Мб+, зависит от браузера. -- Они без срока действия. +- Данные могут храниться неограниченное время. - Данные привязаны к источнику (домен/протокол/порт). | `localStorage` | `sessionStorage` | |----------------|------------------| -| Совместно используется между всеми вкладками и окнами с одинаковым источником | Разделяется в рамках вкладки браузера, среди фреймов из того же источника | +| Совместно используется между всеми вкладками и окнами с одинаковым источником | Разделяется в рамках вкладки браузера, среди ифреймов из того же источника | | "Переживает" перезапуск браузера | "Переживает" перезагрузку страницы (но не закрытие вкладки) | API: -- `setItem(key, value)` -- сохранить пару ключ/значение (key/value). +- `setItem(key, value)` -- сохранить пару ключ/значение. - `getItem(key)` -- получить данные по ключу `key`. - `removeItem(key)` -- удалить значение по ключу `key`. - `clear()` -- удалить всё. -- `key(index)` -- получить ключ на заданной позиции (index). -- `length` -- количество хранимых пар key/value. +- `key(index)` -- получить ключ на заданной позиции. +- `length` -- количество элементов в хранилище. - Используйте `Object.keys` для получения всех ключей. - Можно использовать ключи в качестве свойств объекта, в этом случае событие `storage` не срабатывает. -Событие `storage`: +Событие storage: - Срабатывает при вызове `setItem`, `removeItem`, `clear`. - Содержит все данные об операции, `url` документа и объект хранилища. From 36fcc9fd5e969fe0b108fbb49414017c505fd571 Mon Sep 17 00:00:00 2001 From: perepichai Date: Sun, 14 Jul 2019 14:19:03 +0300 Subject: [PATCH 3/7] =?UTF-8?q?=D0=A3=D0=BF=D1=80=D0=B0=D0=B6=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 6-data-storage/02-localstorage/1-form-autosave/task.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/6-data-storage/02-localstorage/1-form-autosave/task.md b/6-data-storage/02-localstorage/1-form-autosave/task.md index b2e0a42228..672ed72062 100644 --- a/6-data-storage/02-localstorage/1-form-autosave/task.md +++ b/6-data-storage/02-localstorage/1-form-autosave/task.md @@ -1,10 +1,10 @@ -# Autosave a form field +# Автосохранение поля формы -Create a `textarea` field that "autosaves" its value on every change. +Создайте поле `textarea`, значение которого будет автоматически сохраняться при каждом его изменении. -So, if the user occasionally closes the page, and opens it again, he'll find his unfinished input at place. +Когда пользователь закроет страницу и потом откроет ее заново он должен увидеть последнее введенное значение. -Like this: +Например: [iframe src="solution" height=120] From f7bac1b03ec78e17391eb4c2ed1da00829d52e8a Mon Sep 17 00:00:00 2001 From: perepichai Date: Tue, 16 Jul 2019 13:09:20 +0300 Subject: [PATCH 4/7] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 6-data-storage/02-localstorage/article.md | 28 +++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/6-data-storage/02-localstorage/article.md b/6-data-storage/02-localstorage/article.md index 1aa435837f..2defff0b3e 100644 --- a/6-data-storage/02-localstorage/article.md +++ b/6-data-storage/02-localstorage/article.md @@ -7,19 +7,19 @@ Но ведь у нас уже есть куки. Зачем тогда эти объекты? - В отличие от кук, объекты веб-хранилища не отправляются на сервер при каждом запросе. Поэтому мы можем хранить гораздо больше данных. Большинство браузеров могут сохранить как минимум 2 мегабайта данных (или больше), и этот размер можно поменять в настройках. -- Ещё одно отличие от куки - сервер не может манипулировать объектами хранилища через HTTP-заголовки. Все делается при помощи JavaScript. +- Ещё одно отличие от куки - сервер не может манипулировать объектами хранилища через HTTP-заголовки. Всё делается при помощи JavaScript. - Хранилище привязано к источнику (домен/протокол/порт). Это значит, что разные протоколы или поддомены определяют разные объекты хранилища, и они не могут получить доступ к данным друг друга. Объекты хранилища `localStorage` и `sessionStorage` предоставляют одинаковые методы и свойства: -- `setItem(key, value)` -- сохранить пару ключ/значение (key/value). +- `setItem(key, value)` -- сохранить пару ключ/значение. - `getItem(key)` -- получить данные по ключу `key`. - `removeItem(key)` -- удалить данные с ключом `key`. - `clear()` -- удалить всё. -- `key(index)` -- получить ключ на заданной позиции (index). -- `length` -- количество хранимых пар key/value. +- `key(index)` -- получить ключ на заданной позиции. +- `length` -- количество элементов в хранилище. -Как видим, интерфейс похож на `Map` (`setItem/getItem/removeItem`), но также запоминается и порядок элементов, можно получить n-й ключ при помощи `.key(n)`. +Как вы видите, интерфейс похож на `Map` (`setItem/getItem/removeItem`), но также запоминается порядок элементов, и можно получить доступ к элементу по индексу `key(index)`. Давайте посмотрим, как это работает. @@ -44,7 +44,7 @@ alert( localStorage.getItem('test') ); // 1 Нам достаточно находиться на том же источнике (домен/протокол/порт), при этом URL-путь может быть разным. -Объект `localStorage` разделяется, поэтому, если мы устанавливаем данные в одном окне, изменения становятся видимыми в другом. +Объект `localStorage` доступен всем окнам из одного источника, поэтому, если мы устанавливаем данные в одном окне, изменения становятся видимыми в другом. ## Доступ как к обычному объекту @@ -55,10 +55,10 @@ alert( localStorage.getItem('test') ); // 1 // установить значение для ключа localStorage.test = 2; -// получить значение для ключа +// получить значение по ключу alert( localStorage.test ); // 2 -// удалить ключ и его значение +// удалить ключ delete localStorage.test; ``` @@ -78,7 +78,7 @@ delete localStorage.test; К сожалению, объекты веб-хранилища нельзя перебрать в цикле, они не итерируемы. -Но можно пройти по ним как по обычным массивам: +Но можно пройти по ним, как по обычным массивам: ```js run for(let i=0; i Date: Tue, 16 Jul 2019 13:22:22 +0300 Subject: [PATCH 5/7] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 6-data-storage/02-localstorage/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/6-data-storage/02-localstorage/article.md b/6-data-storage/02-localstorage/article.md index 2defff0b3e..d76efae778 100644 --- a/6-data-storage/02-localstorage/article.md +++ b/6-data-storage/02-localstorage/article.md @@ -19,7 +19,7 @@ - `key(index)` -- получить ключ на заданной позиции. - `length` -- количество элементов в хранилище. -Как вы видите, интерфейс похож на `Map` (`setItem/getItem/removeItem`), но также запоминается порядок элементов, и можно получить доступ к элементу по индексу `key(index)`. +Как вы видите, интерфейс похож на `Map` (`setItem/getItem/removeItem`), но также запоминается порядок элементов, и можно получить доступ к элементу по индексу -- `key(index)`. Давайте посмотрим, как это работает. From 6e20af387c4971852e77aeb234762f923522b5dc Mon Sep 17 00:00:00 2001 From: perepichai Date: Tue, 16 Jul 2019 16:25:20 +0300 Subject: [PATCH 6/7] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B84=20+?= =?UTF-8?q?=20index.html?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../02-localstorage/1-form-autosave/solution.view/index.html | 4 ++-- 6-data-storage/02-localstorage/article.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/6-data-storage/02-localstorage/1-form-autosave/solution.view/index.html b/6-data-storage/02-localstorage/1-form-autosave/solution.view/index.html index 7be1989270..24215c9eb6 100644 --- a/6-data-storage/02-localstorage/1-form-autosave/solution.view/index.html +++ b/6-data-storage/02-localstorage/1-form-autosave/solution.view/index.html @@ -1,7 +1,7 @@ - +
- +