
textarea 本身不支持内联样式或 HTML 渲染,因此无法直接高亮部分文本;正确做法是用 contenteditable 的 替代,并通过字符串截取与 DOM 拼接实现动态语法高亮。
textarea 本身不支持内联样式或 html 渲染,因此无法直接高亮部分文本;正确做法是用 `contenteditable` 的 `
在构建轻量级 TypeScript 语法高亮器时,一个常见误区是试图对
// ❌ 错误示例:对 textarea 设置 innerHTML 无效果(且会清空 value) textarea.innerHTML = '<span style="color:red">...</span>'; // 被忽略
✅ 正确方案:使用 contenteditable="true" 的
-
HTML 结构准备:
<div id="editor" contenteditable="true" spellcheck="false" style="font-family: monospace; white-space: pre-wrap; padding: 8px; border: 1px solid #ccc;"></div>
-
TypeScript 高亮函数(安全、可复用):
function applyHighlight( element: HTMLElement, start: number, end: number, color: string = '#d73a49', className: string = 'syntax-highlight' ): void { const text = element.textContent || ''; if (start text.length || start > end) return;
const before = text.substring(0, start); const target = text.substring(start, end); const after = text.substring(end);
// 使用 span 包裹目标文本,并添加 class 和内联样式(便于调试) const highlighted = ${target};
element.innerHTML = ${before}${highlighted}${after}; }
// 使用示例:高亮前 10 个字符为红色 const editor = document.getElementById('editor')!; editor.textContent = 'function hello() { return "world"; }'; applyHighlight(editor, 0, 10, '#e74c3c');
⚠️ **关键注意事项**: - `contenteditable` 元素的 `textContent` 获取的是纯文本(不含 HTML),而 `innerHTML` 用于写入带标签的内容 —— 二者需严格区分; - 高亮操作会**重置光标位置**,如需保留编辑体验,应结合 `Range` 和 `Selection` API 进行光标恢复(进阶需求); - 多次高亮叠加可能导致嵌套 `<span>`,建议在应用新高亮前先清除旧样式(例如 `element.innerHTML = element.textContent`),或使用更健壮的 AST/Token 方案; - 生产环境推荐使用 [Prism.js](https://prismjs.com/)、[CodeMirror](https://codemirror.net/) 或 [Monaco Editor](https://microsoft.github.io/monaco-editor/) 等专业库处理复杂语法高亮。 总结:动态语法高亮的本质是「文本分段 + HTML 注入 + 样式控制」,前提必须放弃 `<textarea>`,转向 `contenteditable` 容器,并始终以 DOM 操作而非字符串拼接 `value` 为核心范式。</textarea></span>
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











