Как сделать поле в Html с возможностью удаления слова по нажатию на кнопку?
я хочу сделать поле в Html, функционал примерно как у поля ввода категорий. То есть человек вводит слово, нажимает enter, это слово сохраняется, после него ставится разделитель и человек может вставить новое слово. Можно ли такое реализовать стандартными средствами js или jquery?
Функционал такой же как у поля "Метки" на этом сайте.
Ответы (1 шт):
Автор решения: De.Minov
→ Ссылка
Для наглядности:
let tmpTAG = '<div class="tag">%VALUE%<div class="-del"></div></div>', // Некий аналог шаблона элемента который будет идти в output
output = document.querySelector('.output'); // Поле output'а
document.querySelector('#enter_word').addEventListener('keydown', function(e) { // Вешаем обработчик на enter_word, на нажатие клавиши
if(e.key.toLowerCase() === 'enter' || e.code.toLowerCase() === 'enter') { // По нажатию кнопки Enter выполняем действие
let val = e.target.value.trim(); // Получаем значение инпута, и удаляем лишние проблемы в начале и конце строки
e.target.value = ''; // Очищаем поле ввода
output.insertAdjacentHTML('beforeEnd', tmpTAG.replace(/%VALUE%/gm, val)); // Вставляем наш шаблон, предварительно заменив в шаблоне %VALUE% на содержимое переменной val
}
});
output.addEventListener('click', function(e) { // Чтобы удалять, вешаем обработчик на output при клике
if(e.target.classList.contains('-del')) { // для упрощения используем делегированное события, проверяя что клик был сделан внутри output, но по классу .-del
e.target.closest('.tag').remove(); // Берём нажатый .-del, возвращаемся к родитлею .tag и удаляем.
}
});
.output .tag {
display: inline-block;
margin-top: 1em;
}
.output {
display: flex;
flex-direction: row;
flex-wrap: wrap;
width: 100%;
margin-top: 10px;
}
.output .tag {
display: block;
background: #07f;
color: #fff;
padding: .25em .5em;
margin: 0 3px 3px 0;
box-sizing: border-box;
}
.output .tag .-del {
display: inline-block;
margin-left: .5em;
cursor: pointer;
}
.output .tag .-del::before {
content: '✖';
display: inline-block;
}
.output .tag .-del:hover::before {
color: red;
}
<input type="text" placeholder="Введите название метки" id="enter_word">
<div class="output"></div>
В идеале я бы сделал так, чтобы все данные хранились в массиве, тогда будет удобнее данными управлять.

