我发现这篇文章显示了如何从一个可信的div中保存和恢复所选文本的2个功能。我有下面的div设置为contenteditable和另一个帖子的2功能。如何使用这些功能来保存和恢复所选文本。
<div style="width:300px;padding:10px;" contenteditable="true">test test test test</div>
<script>
function saveSelection() {
if (window.getSelection) {
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
return sel.getRangeAt(0);
}
} else if (document.selection && document.selection.createRange) {
return document.selection.createRange();
}
return null;
}
function restoreSelection(range) {
if (range) {
if (window.getSelection) {
sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
} else if (document.selection && range.select) {
range.select();
}
}
}
</script>
答案 0 :(得分:20)
典型的用法是显示某种窗口小部件或对话框以接受来自用户的输入(因此可能会破坏原始选择)并在隐藏该窗口小部件后恢复选择。实际上使用这些功能非常简单;最大的危险是试图在选择被摧毁后保存。
这是一个简单的例子。它显示文本输入并使用该输入中的文本覆盖可编辑<div>
中的选择。这里有太多的代码要粘贴,所以这里是完整的代码:http://www.jsfiddle.net/timdown/cCAWC/3/
提取物:
<div id="test" contenteditable="true">Some editable text</div>
<input type="button" unselectable="on" onclick="displayTextInserter();"
value="Insert text">
<div id="textInserter">
<input type="text" id="textToInsert">
<input type="button" onclick="insertText()" value="Insert">
</div>
<script type="text/javascript">
var selRange;
function displayTextInserter() {
selRange = saveSelection();
document.getElementById("textInserter").style.display = "block";
document.getElementById("textToInsert").focus();
}
function insertText() {
var text = document.getElementById("textToInsert").value;
document.getElementById("textInserter").style.display = "none";
restoreSelection(selRange);
document.getElementById("test").focus();
insertTextAtCursor(text);
}
</script>
答案 1 :(得分:1)
只有一个建议:
很难使用本机浏览器选择+ contenteditable +处理所有不同的浏览器方面+从头开始保存和恢复选择等。
我会推荐 rangy https://code.google.com/p/rangy/wiki/SelectionSaveRestoreModule
专门为所有选择而辛苦工作的
检查文档,很容易使用;) 希望它会帮助你