2012-03-23 57 views
1

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

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

// 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/

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

回答

3

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

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

UPDATE 2012年6月18日

瘦长现在已经偏移基于字符保存和选择的恢复,并通过新的TextRange moduledemo)的范围。

+0

真的很好蒂姆,感谢您花时间挂钩我的小提琴。 – Blowsie 2012-03-23 16:02:30