#javascript #html #local-storage
#javascript #HTML #локальное хранилище
Вопрос:
У меня есть страница, где находится форма, которую пользователь может отправлять через нее несколько раз, я хочу сохранить каждое значение, отправленное в одном ключе локального хранилища, но проблема в том, что ключ может хранить только одно значение и перезаписывается следующим значением
Есть ли какая-либо альтернатива?
Комментарии:
1. Почему вы не хотите использовать несколько ключей?
2. Как я могу создать ключ для каждого отправленного значения? как я могу назвать каждый из них? например, пользователь отправляет значение, затем оно присваивается ключу1, а затем снова отправляет другое значение через форму, и оно присваивается ключу2 . Но не станет ли это утомительным, если пользователь отправит 50 раз, и у нас будет 50 разных ключей?
3. Вы могли бы назвать ключи после
input name=""
атрибутов вашей формы.4. Можно хранить целые объекты и массивы в одном ключе, используя JSON.stringify() и JSON.parse() при их извлечении
5.@Yoda Объекты JavaScript являются расширяемыми (т. Е. Вы можете добавлять и удалять к ним свойства) — в части 2 моего ответа вы можете видеть, что код добавляет
field5
кformState
объекту.
Ответ №1:
Есть ли какая-либо альтернатива?
ДА. Используйте объект JSON, который вы десериализуете редактируете повторно сериализуете.
Вот так:
// 1: Initial save:
const formState = {
field1: document.getElementById( 'input1' ).value,
field2: document.getElementById( 'input2' ).value,
field3: document.getElementById( 'input3' ).value,
field4: document.getElementById( 'input4' ).value
};
window.localStorage.setItem( "formState", JSON.stringify( formState ) );
( const
Ключевое слово означает, что ссылка на объект не может быть переназначена, это не означает, что formState
она неизменяема)
Чтобы добавить новое значение к объекту, просто установите его (значения JavaScript object
концептуально совпадают с хэш-таблицей / словарем):
const formState = JSON.parse( window.localStorage.getItem( "formState" ) );
formState.field5 = document.getElementById( 'input5' ).value;
window.localStorage.setItem( "formState", JSON.stringify( formState ) );
Чтобы удалить запись из formState
объекта, используйте delete
ключевое слово:
const formState = JSON.parse( window.localStorage.getItem( "formState" ) );
delete formState.field3; // This removes 'field3' completely.
window.localStorage.setItem( "formState", JSON.stringify( formState ) );
Вы также можете быстро сбросить все <form>
в объект, например:
// WARNING: This code is a quick-and-dirty demonstration, it is not production-quality. You'll need to sort-out handling of multiple-select <select> elements and other types of <input>, like file inputs.
const formState = {};
const form = document.getElementById( 'myForm' );
const inputs = form .querySelectorAll( 'input[name], select[name], textarea[name]' );
for( const input of inputs ) {
let shouldInclude = true;
if( input.tagName == 'INPUT' amp;amp; ( input.type == 'radio' || input.type == 'checkbox') ) {
if( input.checked === false ) shouldInclude = false;
}
if( shouldInclude ) formState[ input.name ] = input.value;
}