
本文介绍在打字练习类应用中,如何动态高亮显示每个字符的正确性——将已输入且正确的字符标为绿色,错误或未输入部分保持默认,从而实现逐字符精准反馈。
本文介绍在打字练习类应用中,如何动态高亮显示每个字符的正确性——将已输入且正确的字符标为绿色,错误或未输入部分保持默认,从而实现逐字符精准反馈。
要在网页中实现「按字符级高亮」(而非整段文字统一变色),核心思路是:将目标文本拆分为单个字符,包裹进独立的 标签,并根据用户输入状态动态更新每个 span 的样式类。原始代码中 textShownInWebPage[i].style.backgroundColor 报错,是因为 textShownInWebPage 是一个 DOM 元素(如 ),它本身不支持通过数字索引([i])访问子字符——DOM 节点不是字符串数组,字符不可直接索引。
✅ 正确做法是:先将原文本(如 "Just some sample text.")转换为带语义标记的 HTML 结构,例如:
<span class="text-to-type"> <span data-index="0">J</span> <span data-index="1">u</span> <span data-index="2">s</span> <span data-index="3">t</span> <!-- ...依此类推 --> </span>
然后在 run() 函数中,遍历每个字符 span,比对 typedValue[i] 与原文第 i 位字符,并添加对应 CSS 类:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
const textEl = document.querySelector(".text-to-type");
const inputEl = document.querySelector(".text-box");
const displayText = "Just some sample text.";
// 初始化:将原文本转为带 span 的结构
function initTextSpans() {
textEl.innerHTML = displayText
.split("")
.map((char, i) => `<span data-index="${i}">${char}</span>`)
.join("");
}
// 实时校验并高亮
function run() {
const typed = inputEl.value;
// 遍历所有字符 span
textEl.querySelectorAll("span").forEach((span, i) => {
if (i <p>配套 CSS 示例:</p><pre class="brush:php;toolbar:false;">.correct { background-color: #a8e6a1; }
.incorrect { background-color: #ffd9d9; }
.text-to-type {
font-family: monospace;
font-size: 1.2rem;
padding: 4px 8px;
line-height: 1.5;
}⚠️ 注意事项:
- 确保 displayText 与 DOM 中初始文本严格一致(包括空格、标点、大小写);
- 若用户删除输入内容,需同步清除后续字符的高亮(上述逻辑已通过 else 分支处理);
- 对于中文、Emoji 或组合字符(如带重音符号的字母),split("") 在现代浏览器中基本可靠;如需极致兼容,可使用 Array.from(displayText);
- 避免频繁操作 innerHTML(如每次输入都重绘全部 span),本文方案仅初始化一次结构,后续仅修改 class,性能更优。
该方法清晰分离结构、逻辑与样式,扩展性强——后续还可轻松加入光标定位、错误计数、动画过渡等特性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










