execCommand insertHTML打破存储的window.getSelection()

时间:2012-03-23 14:34:48

标签: getselection execcommand inserthtml

当使用选择文本和恢复页面中所选文本的方法时,我发现在中间运行execCommand('insertHTML...会导致存储的选择中断。

这是如何选择和恢复文本的示例。

// Get Selection
 var sel = window.getSelection().getRangeAt(0);
 // Clear Selections 
 window.getSelection().removeAllRanges();
 // Restore Selection 
 window.getSelection().addRange(sel)

这样可以正常运行,但是一旦您运行execCommand('insertHTML..,选择endOffset会将自己设置为与选择startOffset相同的值

这有什么理由吗?更重要的是有一种方法吗?


这里可以看到错误的完整示例,以及一些基本的控制台日志记录。 http://jsfiddle.net/blowsie/Y8pJ7/

这个小提琴的目的是选择文本,将其转换为大写,然后重新选择文本。

1 个答案:

答案 0 :(得分:3)

如何最好地保存和恢复选择真的取决于你正在做什么。对于您的具体示例,现有文本只是对其案例进行了转换,我建议使用基于字符索引的方法,例如https://stackoverflow.com/a/5596688/96100(尽管该答案需要Rangy,但可以通过简单的更改而不需要它: http://jsfiddle.net/Y8pJ7/8)。

对于其他一些情况,更好的方法是在选择的开始和结束时使用不可见的标记元素,这是selection save/restore moduleRangy采取的方法(披露:我是Rangy的作者)。

2012年6月18日更新

Rangy现在通过新的TextRange moduledemo)进行基于字符偏移的选择和范围保存和恢复。