在dom更改后重置可编辑内容中的光标位置
reset cursor position in content editable after dom change
我在编写文本时对其进行扩充,例如在contentediatable字段中通过kewords周围的跨度进行语法高亮显示。
我有一个常见的问题,即光标向contenteditable的开头跳跃。我尝试了Nico Burns关于在contentEditable<div>它在示例中起作用,但不适用于我的代码,可能是因为我更改了contenteditable本身内部的DOM。
完整代码:http://pastie.org/2060277
output.addEventListener('keyup',augmentInput,false);
output.addEventListener('keydown',saveCursorPos,false);
output.addEventListener('mousedown',saveCursorPos,false);
output.addEventListener('keyup',restoreCursorPos,false);
function saveCursorPos(e){
//var selection = window.getSelection();
savedRange = window.getSelection().getRangeAt(0);
console.log("save "+e.type,savedRange);
}
function restoreCursorPos(e){
document.getElementById("output").focus();
if (savedRange != null) {
var s = window.getSelection();
if (s.rangeCount > 0){
s.removeAllRanges();
}
s.addRange(savedRange);
console.log("range !=0 "+e.type, savedRange);
}
else {
window.getSelection().addRange(savedRange);
console.log("range ==0 "+e.type, savedRange);
}
}
打击:
- Range的保存方式与鼠标单击时的保存方式相同(参考光标所在的最内部元素,具有正确的偏移量),但如果它是在向下键时保存的(而不是参考可编辑内容本身,startOffset始终为0,无论光标在何处)
- 如果我阻止光标在keydown时保存,而只是使用mouseup来保存它被重新吸收的范围,就像它从未被正确保存或它被更改一样:引用内容可编辑本身,startOffset始终为0。所以我想知道range对象是否在变化,例如反映DOM中的变化
Ranges确实会对DOM中的更改做出反应,并且有规则对此进行管理。未指定影响选定范围的更改是否反映在选择中,浏览器行为也会有所不同。
如果您正在对DOM进行重大更改,我建议使用不同的方法,例如我的Rangy库中的选择保存/恢复模块所使用的方法,即在选择的开始和结束时在DOM中插入临时的不可见标记元素。
相关文章:
- 自定义函数中的光标位置
- jQuery/Javascript>on单击将文本放置在最后一个已知的光标位置
- 当用户单击按钮(在光标位置)时,在输入字段中添加一个文本字符串
- 如何在按键事件发生后获取文本光标的位置
- 内容可编辑分区-根据内部HTML位置的光标位置
- 保持光标位置元素在顶部使用 svg
- 保存键控触发器时保持光标位置的最佳做法
- 如何在java脚本中获取光标位置
- 获取光标位置或光标在 TinyMCE 中的行数
- 如何在每次页面重新加载时更改渐变背景,同时保持光标位置元素处于活动状态
- 在Chrome中,光标位置异常地位于输入值的末尾
- 在光标位置的文本区域中插入一个字符串,并进行一些更改
- 如何从谷歌地图事件访问光标位置(即页面的x和y轴)
- 如何在光标所在的位置绘制线条?HTML5画布使用MrDoob's和谐
- 如何在网页加载asp.net上显示文本框中第二个字母的光标位置
- 当前光标位置(百分比)
- GWT:如何从当前光标位置或所选文本中获取css样式的属性
- 在光标位置插入HTML,并使用javascript将光标移动到插入的HTML的末尾
- jQuery:使用插件Tipsy将工具提示附加到鼠标光标位置
- 不带HTML的光标位置需要转换为带HTML的位置