如何实现实时输入时自动高亮关键词(无需按空格)

碧海醫心

碧海醫心

2026-07-04

631人浏览

原创

如何实现实时输入时自动高亮关键词(无需按空格)

本文详解如何将 HTML 编辑器中关键词的着色逻辑从“按空格后触发”升级为“输入末尾字母即实时着色”,通过替换 keyup 事件为 input 事件、优化 DOM 操作与光标恢复逻辑,确保语法高亮响应迅速且体验流畅。

本文详解如何将 html 编辑器中关键词的着色逻辑从“按空格后触发”升级为“输入末尾字母即实时着色”,通过替换 `keyup` 事件为 `input` 事件、优化 dom 操作与光标恢复逻辑,确保语法高亮响应迅速且体验流畅。

在构建简易 HTML 实时编辑器时,一个常见需求是:当用户输入如

、HELLO 或 /div> 等预设关键词时,希望它们立即高亮(例如变为橙色),而非等待用户敲下空格键才触发着色。原始代码的问题根源在于:changeColor() 函数错误地将 keyup 事件监听器绑定在 input 元素内部,并仅在 keyCode === 32(空格)时执行着色——这导致所有非空格输入均被忽略。

✅ 正确方案:使用 input 事件驱动实时着色

input 事件在

内容发生任何变更(包括输入、删除、粘贴、撤销等)时立即触发,天然适配实时高亮场景。我们应移除冗余的 addEventListener("keyup", ...),直接在 oninput 属性或 JS 中统一调用 changeColor():
<div id="editor" contenteditable="true" oninput="changeColor(); showPreview();">
  <h1>This is a Heading</h1>
  <p>This is a paragraph.</p>
</div>

同时,changeColor() 函数需重构为无条件执行着色 + 光标修复,不再依赖按键判断:

function changeColor() {
  const editor = document.getElementById("editor");
  applyColoring(editor);

  // 关键:恢复光标到编辑末尾,避免着色后光标跳回开头
  const range = document.createRange();
  const sel = window.getSelection();
  range.selectNodeContents(editor);
  range.collapse(false); // collapse to end
  sel.removeAllRanges();
  sel.addRange(range);
  editor.focus();
}

⚠️ 注意:原代码中 range.setStart(child[child.length - 1], 1) 存在风险——child 是 editor.children,但 contenteditable 的子节点可能为 或文本节点,且长度动态变化。更健壮的做法是 range.selectNodeContents(editor) 后 collapse(false),直接定位到内容末尾。

可视化HTML编辑器插件xhedit
可视化HTML编辑器插件xhedit

可视化HTML编辑器插件xhedit

下载

? applyColoring() 优化要点

  • 去重关键词数组:原代码 ["DIV", "DIV", "H1", "H1"] 含重复项,应精简为 ["DIV", "H1", "P", "HELLO", "", "/"]。
  • 大小写安全匹配:正则使用 "i" 标志,keywords.includes(chunk.toUpperCase()) 确保 hello 和 HELLO 均可匹配。
  • 避免 innerHTML 覆盖格式:element.innerHTML = markup 会重置光标位置,因此必须在赋值后立即恢复光标(见上方 changeColor() 实现)。

? 预览功能增强(防 XSS 安全建议)

原 showPreview() 直接写入 iframe.document.write() 可能引发安全问题。推荐改用 src="data:text/html,... 方式加载内容(已集成在示例中):

function showPreview() {
  const content = document.getElementById("editor").innerText;
  const encoded = encodeURIComponent(content);
  const dataURL = `data:text/html;charset=utf-8,${encoded}`;
  document.getElementById("preview-window").src = dataURL;
}

此方式自动转义 HTML 特殊字符,规避脚本注入风险。

✅ 最终效果与验证

  • 输入 HELLO → 第5个字母 O 输入完成瞬间,HELLO 即变为橙色;
  • 删除任意字符 → 着色区域实时更新;
  • 粘贴
    test
    → 所有匹配标签即时高亮;
  • 光标始终停留在当前编辑位置,无跳动。

通过将事件模型从“按键驱动”切换为“内容驱动”,并辅以鲁棒的光标管理,即可实现专业级的实时语法高亮体验。此模式同样适用于 Markdown 预览、JSON 格式化等场景。

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

2552

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

1677

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

1415

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

1342

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

3686

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

1368

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

1126

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

1080

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

989

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.4万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 131.8万人学习