이 솔루션은 모든 주요 브라우저에서 작동합니다.
saveSelection()
은 div 의 onmouseup
및 onkeyup
이벤트에 첨부되고 선택 사항을 변수에 저장합니다 savedRange
.
restoreSelection()
은 onfocus
div 의 이벤트에 첨부되고에 저장된 선택을 다시 선택합니다 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>
contentEditable
IE가 아닌 브라우저에서 작동 하는지 몰랐습니다 o_o