Сохранение изменений | localstorage и sessionStorage | JavaScript

Что такое localstorage

Пользователь активно работает со страницей: заполняет поля формы, нажимает на кнопки, открывает скрытый блок и т.п. Но при обновлении страницы результат исчезает, HTML-документ возвращаясь в исходное состояние. Чтобы браузер запоминал выбор человека можно воспользоваться локальным хранилищем.

localStorage — «ключ/значение» хранится в браузере, пока пользователь не очистит его локальное хранилище. Можно несколько дней не заходить на веб-проект и по возвращении на сайт увидеть ранее заполненную форму.

Размер localstorage

"A mostly arbitrary limit of five megabytes per origin is suggested. Implementation feedback is welcome and will be used to update this suggestion in the future." [w3.org] То есть рекомендуется предоставлять одному домену как минимум 5 мегабайт. Большинство браузеров используют именно этот лимит.

Что такое sessionStorage

sessionStorage — «ключ/значение» хранится в браузере пока открыта вкладка. То есть можно свободно перемещаться по сайту, обновлять страницу, но не закрывать вкладку или окно браузера.

Как сохранить действие после нажатия кнопки в JS

Задача: если элемент щелчком вывели на экран, то не удалять его в течении длительного времени.

Я тут. Когда вы вернётесь спустя пару дней я снова буду тут.
<style>
#idVhod {
  display: none; /* изначально скрыт */ 
}
</style>

<button onclick="onclickVhod()">открыть</button> <span id="idVhod">скрытый текст</span>

<script>
var idVhod = document.getElementById('idVhod');

function onclickVhod() {
  idVhod.style.display = (idVhod.style.display == 'inline') ? '' : 'inline';
  localStorage.setItem('hide', idVhod.style.display); // сохраняем значение в ключ hide
}

if(localStorage.getItem('hide') == 'inline') { // если значение ключа hide "inline"
  document.getElementById('idVhod').style.display = 'inline';
}
</script>

Автосохранение заполненных полей на JavaScript

Вы никогда не сталкивались с ситуацией, когда заполняешь форму (регистрации или комментариев), нажимаешь кнопку "Отправить", а вам показывается сообщение об ошибке и всё ранее написанное удаляется? Крайне неприятно. Задача: сохранить заполненные поля, пока открыта вкладка. На новой вкладке данные должны пропадать. Базой послужил код с этого сайта.


<textarea id="comment"></textarea>
<input type="text" id="fio">

<script>
var elements = document.querySelectorAll('input, textarea');

function checkValidity() {};

for (i=0; i<elements.length; i++) {
 (function(element) {
   var id = element.getAttribute('id');
   element.value = sessionStorage.getItem(id); // обязательно наличие у элементов id
   element.oninput = function() {
     sessionStorage.setItem(id, element.value);
     checkValidity();
   };
 })(elements[i]);
}
</script>

Задача: если человек пришёл первый раз и ни разу не менял значение поля даты, то нужно показать ему текущую дату, иначе ту, которую он ввёл последний раз. Практическое применение.

или
<input type="date" class="raz" onchange="localStorage.setItem('server', this.value);">
<input type="button" value="очистить localstorage и перезагрузить страницу" onclick="localStorage.clear(); location.reload();" />
или
<input type="button" value="удалить localstorage определённого элемента и перезагрузить страницу" onclick="localStorage.removeItem('server'); location.reload();" />

<script>
var dataRaz = document.querySelector('input[type="date"].raz');

if(localStorage.getItem('server') === null) { // если localStorage.getItem пустой
  dataRaz.value = new Date().toJSON().slice(0,10); // сегодняшняя дата
} else {
  dataRaz.value = localStorage.getItem('server'); // последняя дата, на которую изменил пользователь
}
</script>

Сохранять у чебокса checked при обновлении страницы

Источник

<input type="checkbox" id="stat">

<script>
document.getElementById('stat').onclick = function() {
  if(document.getElementById('stat').checked) {
    localStorage.setItem('stat', "true");
  } else {
    localStorage.setItem('stat', "false");
  }
}
if (localStorage.getItem('stat') == "true") {
  document.getElementById("stat").setAttribute('checked','checked');
}
</script>

Чтобы браузер пользователя запоминал какую радиокнопку тот выбрал в прошлый раз

<input type="radio" checked="checked" name="raz" value="1"/> <input type="radio" name="raz" value="2"/> <input type="radio" name="raz" value="3"/>

<script>
var raz = document.getElementsByName('raz');
for (var i = 0; i < raz.length; i++) {
  raz[i].onclick = function() {
    localStorage.setItem('IRadioRaz', this.value);
  }
}
if(localStorage.getItem('IRadioRaz')) {
  var IRadioRaz = localStorage.getItem('IRadioRaz');
  document.querySelector('input[name="raz"][value="' + IRadioRaz + '"]').setAttribute('checked','checked');
}
</script>

Сохранять выбранное значение select

Источник

<select id="fruit">
    <option value="0">1</option>
    <option value="1">2</option>
    <option value="2">3</option>
    <option value="3">4</option>
</select>

<script>
document.getElementById("fruit").onchange = function() {
    localStorage.setItem('fruit', document.getElementById("fruit").value);
}

if (localStorage.getItem('fruit')) {
    document.getElementById("fruit").options[localStorage.getItem('fruit')].selected = true;
}
</script>
sessionstorage один раз javascript
в f t
наверх ↑

23 комментария:

диана галиева
Огромное спасибо за твои топики! Всегда помогают! shpargalkablog.ru рулит...
NMitra
Благодарю за тёплые слова :)
Анонимный
Здравствуйте а как сохранять у чебокса checked при обновлении страницы если несколько чекбоксов с name="formDoor[]". Спасибо
NMitra
Здравствуйте, дополнила статью радиокнопками
Анонимный
Здравствуйте!
Как вывести значение ключа, например в div'e, если ввести ключ в input?
LocalStorage: apple (ключ) - fruit (значение)
Например ввожу: apple
Нажимаю Enter и в div'е появляется слово: fruit

< input type="text" id="in" >
< div id="out">< /div>
< script> ? < /script>
NMitra
document.getElementById("in").oninput = function() {
document.getElementById("out").innerHTML = localStorage.getItem(this.value);
}
Анонимный
1) Ввожу в input: apple=fruit
2) Жму Enter (код клавиши вроде 13?)
3) В LocalStorage станет: apple (ключ) - fruit (значение)
Было просто супер!
NMitra
Два инпута легче сделать <input type="text" id="in1">
document.getElementById("in").onchange=raz;
document.getElementById("in1").onchange=raz;
function raz() {
localStorage.setItem(document.getElementById("in").value, document.getElementById("in1").value)
}
Анонимный
Большое вам спасибо! Отличный блог = отличный материал!
Анонимный
В input (id="in") ввожу: apple=fruit

document.getElementById("in").oninput = function() {
var result = str.split('=');
localStorage.setItem( ??? всё, что до знака "=" положить в столбец "key" LocalStorage ??? )
localStorage.setItem( ??? всё, что после знака "=" положить в столбец "value" LocalStorage ??? )
}

Хочется чтобы был всё-таки один input.
В input'e знак "=" будет только один раз!
Был бы просто счастлив!
NMitra
document.getElementById("in").onchange=raz;
function raz() {
var str = document.getElementById("in").value;
localStorage.setItem(str.split('=')[0], str.split('=')[1]);
}
Анонимный
Вау! Чудеса! Огромнейшее спасибо! Я счастлив! Это лучший блог, что я видел!
Анонимный
LocalStorage (key - value):
Item1 - a
Item2 - b
Item3 - c
...

Главное условие:
! При создании записи в LocalStorage не должно быть одинаковых ключей (весь список ключей в LocalStorage должен состоять из РАЗНЫХ уникальных ключей без дублирования)

Процедура:
1) Пользователь вводит имя ключа в поле ввода: Например, Item1
2) Считываем ключ (получаем value поля ввода, в которое пользователь вводил ключ)
3) Очищаем поле ввода
4) Проверяем, есть ли данный ключ в LocalStorage.
Если есть, то выводим его значение в div (в данное примере значение ключа Item1 = a)
Если нет, то создаем новую запись с этим ключом (см. Главное условие)

Заготовка html:
< div id="out">< /div>
< input type="text" id="in" >
< script>
// 2)
document.getElementById("in")
// 3)
input.value = " "
// 4) if ???
... такой ключ есть, следовательно:
document.getElementById("out").innerHTML = localStorage.getItem(this.value);
в противном случае:
localStorage.setItem(document.getElementById("in").value
< /script>

Данная задачка - это высший пилотаж для меня, поэтому я обращаюсь к вам, NMitra.
NMitra
Простите, не успеваю, подробнее http://shpargalkablog.ru/p/comments-blog.html
Анонимный
Прощаю )
Александар Решетняк
Наконец то понятная статья по LocalStorage. Благодарим^ ^
..вопросик, а как правильно переделать вариант 'Как сохранить действие после нажатия кнопки в JS'
для добавления/удаления Класса ?

NMitra
<style>
.raz {
display: none;
}
</style>

<script>
var idVhod = document.getElementById('idVhod');

function onclickVhod() {
idVhod.className = (idVhod.className == 'raz') ? '' : 'raz';
localStorage.setItem('hide', idVhod.className); // сохраняем значение в ключ hide
}

if(localStorage.getItem('hide') == 'raz') {
document.getElementById('idVhod').className = 'raz';
}
</script>
Анонимный
скажите как сделать чтоб по клику на кнопке менять значение переменной в localStorage
допустим кликнули на кнопке занесли в localStorage
localStorage.setItem("minibar", "true");
кликнули опять по кнопке поменяли на false
localStorage.setItem("minibar", "false");
и так по кругу
NMitra
function Raz() {
var h = localStorage.getItem('hide');
if (h != 'true' || h == null) {
localStorage.setItem('hide', 'true');
}else{
localStorage.setItem('hide', 'false');
}
}
Анонимный
Здравствуйте, а как отобразить блок при вводе ключа?
NMitra
Здравствуйте, я не знаю полной задачи поэтому не могу дать решение. Вы будете подгружать содержимое с другой страницы или у вас блок уже есть на странице, только он изначально скрыт, или что-то другое.
Анонимный
Здравствуйте! NMitra, планируете ли вы дополнить эту тему сохранением изменений в IndexedDB?
Спасибо.
NMitra
Здравствуйте, хотелось бы. Но на сегодняшний день просьб с написанием статей больше, чем я могу одолеть. Я пока их по времени обращения разложила. Боюсь, что вам быстрее будет самим разобраться :( Но за идею спасибо! Когда-нибудь и до неё дойду.