Добавлять class в div при вводе текста в input
Всем привет!
Помогите пожалуйста сделать, заранее очень сильно благодарен вам! Вводим в input, слово start. это слово добавляется как class в div с уже фиксированным class'ом SOS. <div class="SOS start">текст</div> Не прерывая сеанса, если вписать слово stop, то второй класс меняется на: <div class="SOS stop">текст</div> если вписать слово status, то второй класс меняется на: <div class="SOS status">текст</div> Ну и добить проверкой, чтобы слова start, stop, status заранее были вписаны в скрипт js чтобы он их добавлял, тобишь если написать слово prostotext или какое либо другое которого нет в списке на проверку, скрипт будет вставлять class под именем error <div class="SOS error">текст</div> Кому не трудно, у кого есть пару минут свободного времени, помогите пожалуйста, буду очень благодарен и +1000 к карме. |
<div class="sos">CSS is awesome. I ♥ JS</div> <input class="sos" id="my-field" type="text" autofocus placeholder="Введи stop, start..."> <style> .sos { --x-color: var(--color, black); padding: 1em; margin: 1em; border-radius: .4em; font-weight: bold; outline: 0; border: .2em solid var(--x-color); color: var(--x-color); transition: 1s; } .sos:hover { box-shadow: inset 0 0 0 3em var(--x-color); color: white; } .sos.start { --color: #52cc11; } .sos.stop { --color: #cc112e; } .sos.status { --color: #11cc92; } .sos.error { --color: #c4bfb1; } </style> <script> { let classNamesRE = /^(start|stop|status)$/; let input = document.getElementById("my-field"); let div = document.querySelector(".sos"); let onInputHandler = event => { let match = event.target.value.match(classNamesRE); if(!match) match = ["", "error"]; event.target.className = div.className = ["sos", match[1]].join(" "); }; input.addEventListener("input", onInputHandler); }; </script> Для изменения цвета используются пользовательские CSS-свойства, которые позволяют значительно сократить код. Этот пример использует переменные таким образом, которым вы не можете действительно сделать с Sass. |
Malleys,
а если так ... { let classNamesRE = /^(?:start|stop|status)$/; let input = document.getElementById("my-field"); let div = document.querySelector(".sos"); let onInputHandler = event => { let match = event.target.value.match(classNamesRE)||"error"; event.target.className = div.className = "sos " + match; }; input.addEventListener("input", onInputHandler); }; и не могли бы вы на пальцах обьяснить, для тех кто не в танке фразу Цитата:
|
Работает, спасибо ребят!
Есть 1 нюанс который хотелось бы исправить и про который я наверное забыл сказать ранее, подскажите пожалуйста как сделать чтобы class'ы добавлялись не моментально при вводе текста, а при нажатии на enter |
skwz,
{ let classNamesRE = /^(?:start|stop|status)$/; let input = document.getElementById("my-field"); let div = document.querySelector(".sos"); let onInputHandler = event => { let match = (event.code === "Enter" && event.target.value.match(classNamesRE))||"error"; event.target.className = div.className = "sos " + match; }; input.addEventListener("keyup", onInputHandler); }; |
Прям как нужно спасибо) только хотелось бы еще чтобы class error тоже по нажатию на Enter срабатывал, если стирать текст с поля, то class error тоже по сути должен удаляться. И тогда получится то что я и хотел :dance:
|
skwz,
{ let classNamesRE = /^(?:start|stop|status)$/; let input = document.getElementById("my-field"); let div = document.querySelector(".sos"); let onInputHandler = event => { let val = event.target.value.trim(); let match = event.code === "Enter" && val ? (val.match(classNamesRE)||"error") : ""; event.target.className = div.className = "sos " + match; }; input.addEventListener("keyup", onInputHandler); }; |
рони, спасибо, вы меня очень выручили :thanks:
|
Цитата:
|
Malleys,
Спасибо огромное! :) |
Часовой пояс GMT +3, время: 02:08. |