javascript - 在 contenteditable div 中更改 innerHTML 时保留光标位置
问题描述
我正在构建一个对代码进行语法突出显示的编辑器。我目前的方法是只获取编辑器中的文本(一个 contenteditable 设置为 true 的 div)并检查字符串中的正则表达式匹配。然后,我将匹配项替换为<span>
元素并将一些样式应用于这些 span 元素。.innerHTML
然后,我使用该属性将分隔线中的完整文本替换为新文本。这工作得很好,但我必须向后输入,因为在插入文本时,我的光标被重置为零位置。我尝试在插入之前记录值selectionStart
然后执行
element.selectionStart = oldSelectionStart + 1;
但它没有用。我认为这是因为 chrome 的渲染管道,其中 JavaScript 在渲染页面之前运行,并且光标在渲染时重置,而不是在设置时......有人可以帮忙吗?我如何设法将光标保持在原来的位置?
解决方案
element.selectionStart
适用于输入元素,不适用于contentEditable
元素。您应该尝试创建一个Range
对象,设置其startContainer
&startOffset
并折叠它以在所需位置设置插入符号。有关详细信息,请参阅 [https://developer.mozilla.org/en-US/docs/Web/API/Range]。
PS:如果您想将光标设置为“行尾”,您可以轻松地range.selectNode(requiredNode)
将range.collapse(true)
插入符号移动到节点的末尾,即行
推荐阅读
- java - 更改 OpenJFX 中 TreeTableCell 内的 TextField 中的值
- powershell - 我想编写一个 Powershell 脚本,它将以管理员身份打开 CMD 并在 CMD 中执行所需的命令
- android - Flutter Firebase 匹配用户数据
- java - 错误:未编组的对象是骆驼 XML 文件中不受支持的类型
- regex - 如何在范围内拆分字符串
- c++ - 将第三方 SDK 集成到我的项目中
- awk - awk 范围需要正确
- flutter - 我希望 valueIndicator 始终在 Flutter 的 RangeSlider 中打开
- c++ - 工具栏中带有 QAction 的 Qt QActionGroup
- vue.js - 在 vue cli 中添加外部 js 文件