我在编写文本时对其进行扩充,例如语法突出显示通过围绕kewords的跨度,在一个contentediatable字段中。
我有一个常见的问题,即光标跳到了可疑的开头。我尝试了Nico Burns在Set cursor position on contentEditable <div>上的解决方案,它在示例中起作用,但不适用于我的代码,可能是因为我在可信任的内部更改了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);
}
}
引人注目:
答案 0 :(得分:1)
范围会对DOM中的更改做出反应,并且rules governing this。是否指定了影响所选范围的更改是否反映在选择中,并且浏览器行为会有所不同。
如果您对DOM进行了重大更改,我建议您使用其他方法,例如我save/restore module库中的选择Rangy使用的方法,即临时插入在选择的开始和结束时DOM中的不可见标记元素。