Как сохранить состояние для radio-кнопок, checkbox, select
Есть форма с селектом, инпутами, радио, чекбоксами и т.п. Необходимо, чтобы при обновлении данные сохранялись (localstorage мне в помощь)
Но у меня возникает вопрос с перебором множества чекбоксов, селектов и т.п как эти данные поместить в один объект, например? Создаватьвложенный бъект?
Внизу привожу то, что сумел реализовать)
let form = document.querySelector('form')
let input = document.querySelector('input')
let textarea = document.querySelector('textarea')
let checkbox = document.querySelector('input[type=checkbox]')
let radiobuttons = document.querySelectorAll('input[type=radio]:checked')
if (localStorage.getItem('param') !== null) {
let param = JSON.parse(localStorage.getItem('param'));
input.value = param.input
textarea.value = param.textarea
checkbox.checked = param.checkbox
}
document.addEventListener('input', function(e) {
localStorage.setItem('param', JSON.stringify({input: input.value, textarea: textarea.value, checkbox: checkbox.checked}))
})
<form action="">
<input type="text"/>
<textarea name="t" id="text"></textarea>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id=""/>
<label class="form-check-label" for=""> Default checkbox </label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id=""/>
<label class="form-check-label" for=""> Checked checkbox </label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="" id=""/>
<label class="form-check-label" for=""> Default radio </label>
</div>
<div class="form-check">
<input
class="form-check-input"
type="radio"
name=""
id=""
/>
<label class="form-check-label" for=""> Default radio </label>
<div class="form-check">
<input
class="form-check-input"
type="radio"
name=""
id=""
/>
<label class="form-check-label" for=""> Default radio </label>
</div>
<select name="select" id="select">
<option value="name1">name1</option>
<option value="name2">name2</option>
<option value="name3">name3</option>
</select>
</div>
</form>
Ответы (1 шт):
Размечаете все элементы формы своим id, так же размечаете каким нибудь атрибутом элементы формы, которые должны сохраняться(у меня в примере это data-save
)
Что делает скрипт:
Отбирает элемент form
Далее внутри form находит все элементы с атрибутом data-save
.
При изменении проходит все выбранные элементы и сохраняет их значения в объект со структурой [id_элемента]: значение_элемента
и сохраняет в localStorage.
При загрузке сраницы, беруться данные из localStorage и записываются в отобранные элементы по своему id
const form = document.querySelector('form')
const saves = form.querySelectorAll('[data-save]');
document.addEventListener('DOMContentLoaded', () => {
const param = JSON.parse(localStorage.getItem('param') || '{}');
saves.forEach(item => {
if (item.type === 'radio' || item.type === 'checkbox') {
item.checked = param[item.id] ?? false
} else {
item.value = param[item.id] ?? ''
}
});
})
document.addEventListener('input', function(e) {
const param = {}
saves.forEach(item => {
param[item.id] = (item.type === 'radio' || item.type === 'checkbox') ? item.checked : item.value;
});
localStorage.setItem('param', JSON.stringify(param));
})
<form action="">
<input data-save type="text" id="inp1" /><br />
<input data-save type="text" id="inp2" /><br />
<textarea data-save name="t" id="text"></textarea><br />
<textarea data-save name="t" id="text2"></textarea><br />
<div class="form-check">
<input data-save class="form-check-input" type="checkbox" value="0" id="inp3"/>
<input data-save class="form-check-input" type="checkbox" value="1" id="inp4"/>
<label class="form-check-label" for=""> Default checkbox </label>
</div>
<div class="form-check">
<input data-save class="form-check-input" type="radio" value="0" id="inp5" name="r2" />
<input data-save class="form-check-input" type="radio" value="1" id="inp6" name="r2" />
<label class="form-check-label" for=""> Checked checkbox </label>
</div>
<select data-save name="select" id="select">
<option value="name1">name1</option>
<option value="name2">name2</option>
<option value="name3">name3</option>
</select>
</form>
У input с типом radio и checkbox нет value, есть свойство checked.
P.S.: Возможно я какие то типы или элементы пропустил, думаю не составит труда подправить этот скрипт под их особенности