이 솔루션은 모든 주요 브라우저에서 작동합니다.
saveSelection()은 div 의 onmouseup및 onkeyup이벤트에 첨부되고 선택 사항을 변수에 저장합니다 savedRange.
restoreSelection()은 onfocusdiv 의 이벤트에 첨부되고에 저장된 선택을 다시 선택합니다 savedRange.
사용자가 div를 클릭 할 때 선택을 복원하지 않으려는 경우 완벽하게 작동합니다 (일반적으로 커서는 클릭하는 곳으로 이동하지만 코드는 완전성을 위해 포함됨)
이를 달성하기 위해 onclick및 onmousedown이벤트는 이벤트를 취소 cancelEvent()하는 크로스 브라우저 기능인 기능에 의해 취소됩니다. cancelEvent()기능도 실행 restoreSelection()클릭 이벤트가 취소 될 때 사업부가 포커스를받지 않고이 기능을 실행하지 않는 때문에 아무것도 전혀 선택되지 않기 때문에 기능.
변수 isInFocus는 포커스가 있는지 여부를 저장하고 "false" onblur및 "true"로 변경됩니다 onfocus. 이렇게하면 div의 초점이 맞지 않을 때만 클릭 이벤트를 취소 할 수 있습니다 (그렇지 않으면 선택을 전혀 변경할 수 없음).
당신은 선택을 복원 사업부는 클릭에 의해 초점이 맞춰지면 변화를, 그리고하지 않는 선택을하려는 경우 onclick(초점이 요소에 부여 된 경우에만 programtically 사용 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>
contentEditableIE가 아닌 브라우저에서 작동 하는지 몰랐습니다 o_o