Выразительный JavaScript (Хавербеке) - страница 202

>  }


>  // Берём список из локального хранилища

>  var notes = JSON.parse(localStorage.getItem("notes")) ||

>              {"что купить": ""};

>  for (var name in notes)

>    if (notes.hasOwnProperty(name))

>      addToList(name);


>  function saveToStorage() {

>    localStorage.setItem("notes", JSON.stringify(notes));

>  }


>  var current = document.querySelector("#currentnote");

>  current.value = notes[list.value];


>  list.addEventListener("change", function() {

>    current.value = notes[list.value];

>  });

>  current.addEventListener("change", function() {

>    notes[list.value] = current.value;

>    saveToStorage();

>  });


>  function addNote() {

>    var name = prompt("Имя записи", "");

>    if (!name) return;

>    if (!notes.hasOwnProperty(name)) {

>      notes[name] = "";

>      addToList(name);

>      saveToStorage();

>    }

>    list.value = name;

>    current.value = notes[name];

>  }

>

Скрипт инициализирует переменную >notes значением из >localStorage, а если его там нет – простым объектом с одной записью «что купить». Попытка прочесть отсутствующее поле из >localStorage вернёт >null. Передав >null в >JSON.parse, мы получим >null обратно. Поэтому для значения по умолчанию можно использовать оператор >||.

Когда данные в >note меняются (добавляется новая запись или меняется текущая), для обновления хранимого поля вызывается функция >saveToStorage. Если б мы рассчитывали, что у нас будут храниться тысячи записей, это было бы слишком накладно, и нам пришлось бы придумать более сложную процедуру для хранения – например, своё поле для каждой записи.

Когда пользователь добавляет запись, код должен обновить текстовое поле, хотя у поля и есть обработчик >“change”. Это нужно потому, что событие >“change” происходит, только когда пользователь меняет значение поля, а не когда это делает скрипт.

Есть ещё один похожий на >localStorage объект под названием >sessionStorage. Разница между ними в том, что содержимое >sessionStorage забывается по окончанию сессии, что для большинства браузеров означает момент закрытия.

Итог

HTML предоставляет множество различных типов полей формы – текстовые, галочки, множественного выбора, выбора файла.

Из JavaScript можно получать значение и манипулировать этими полями. По изменению они запускают событие >“change”, по вводу с клавиатуры – >“input”, и ещё много разных клавиатурных событий. Они помогают нам отловить момент, когда пользователь взаимодействует с полем ввода. Свойства вроде >value (для текстовых полей и >select) или >checked (для галочек и радиокнопок) используются для чтения и записи содержимого полей.