此解决方案适用于所有主流浏览器:
saveSelection()
附加到 div 的 和 事件,并将所选内容保存到变量 。onmouseup
onkeyup
savedRange
restoreSelection()
附加到 div 的事件,并重新选择保存在 中的选择。onfocus
savedRange
这可以完美地工作,除非您希望在用户单击div时恢复选择(这有点不直观,因为通常您希望光标转到您单击的位置,但为了完整性而包含代码)
为了实现这一点,和 事件被函数取消,该函数是用于取消事件的跨浏览器函数。该函数还运行该函数,因为当单击事件被取消时,div 不会接收焦点,因此除非运行此函数,否则根本不选择任何内容。onclick
onmousedown
cancelEvent()
cancelEvent()
restoreSelection()
该变量存储它是否处于焦点中,并更改为“false”和“true”。这允许仅在 div 不在焦点时取消单击事件(否则您将根本无法更改选择)。isInFocus
onblur
onfocus
如果您希望在通过单击对 div 进行聚焦时更改选择,而不是恢复选择(并且仅当焦点以编程方式使用或类似方式分配给元素时,则只需删除 and 事件即可。在这些情况下,事件和 和 函数也可以安全地删除。onclick
document.getElementById("area").focus();
onclick
onmousedown
onblur
onDivBlur()
cancelEvent()
如果要快速测试,则将此代码直接放入html页面的正文中,则应有效:
<div id="area" style="width:300px;height:300px;" onblur="onDivBlur();" onmousedown="return cancelEvent(event);" onclick="return cancelEvent(event);" contentEditable="true" onmouseup="saveSelection();" onkeyup="saveSelection();" onfocus="restoreSelection();"></div>
<script type="text/javascript">
var savedRange,isInFocus;
function saveSelection()
{
if(window.getSelection)//non IE Browsers
{
savedRange = window.getSelection().getRangeAt(0);
}
else if(document.selection)//IE
{
savedRange = document.selection.createRange();
}
}
function restoreSelection()
{
isInFocus = true;
document.getElementById("area").focus();
if (savedRange != null) {
if (window.getSelection)//non IE and there is already a selection
{
var s = window.getSelection();
if (s.rangeCount > 0)
s.removeAllRanges();
s.addRange(savedRange);
}
else if (document.createRange)//non IE and no selection
{
window.getSelection().addRange(savedRange);
}
else if (document.selection)//IE
{
savedRange.select();
}
}
}
//this part onwards is only needed if you want to restore selection onclick
var isInFocus = false;
function onDivBlur()
{
isInFocus = false;
}
function cancelEvent(e)
{
if (isInFocus == false && savedRange != null) {
if (e && e.preventDefault) {
//alert("FF");
e.stopPropagation(); // DOM style (return false doesn't always work in FF)
e.preventDefault();
}
else {
window.event.cancelBubble = true;//IE stopPropagation
}
restoreSelection();
return false; // false = IE style
}
}
</script>