Элемент textarea
не позволяет применить стиль к отдельным словам, поэтому проще всего добавить сообщение об ошибке под элементом ввода. Этот ответ показывает, как этого можно достичь.
Однако есть трудный путь.
Вы можете использовать элемент HTML с атрибутом contenteditable
. Это позволяет пользователям редактировать содержимое элемента HTML. Если вы зададите ему границу и используете белый фон, он будет выглядеть как элемент textarea
.
В этом примере я решил выделить зеленым цветом текст, соответствующий строке, а все остальное - красным.
let string = "The quick brown fox jumps over the lazy dog";
let input = document.querySelector("div");
input.addEventListener("focus", () => {
// Remove styling so as to not distract the user.
for (let i = 0; i < input.children.length; i++) {
input.children[i].className = "";
}
});
input.addEventListener("blur", () => {
// We will recreate styling tags. This is under the assumption that the
// element will not have a lot of text.
let value = input.textContent;
input.textContent= "";
let failPoint = -1;
for (var i = 0; i < string.length && i < value.length; i++) {
if (value[i].toLowerCase() !== string[i].toLowerCase()) {
failPoint = i;
break;
}
}
let good = document.createElement("span");
good.classList.add("success");
good.textContent = value.substring(0, failPoint !== -1 ? failPoint : value.length);
input.append(good);
if (failPoint !== -1) {
let bad = document.createElement("span");
bad.classList.add("error");
bad.textContent = value.substring(i);
input.append(bad);
}
});
.editable {
border: 1px solid #ccc;
width: 300px;
height: 100px;
overflow: auto;
background: white;
color: #020202;
padding: 2px;
word-break: break-all;
font-family: sans-serif;
}
.success {
color: green;
}
.error {
color: red;
}
<div class="editable" contenteditable spellcheck="false"></div>