Bu çözüm tüm büyük tarayıcılarda çalışır:
saveSelection()div'in onmouseupve onkeyupolaylarına eklenir ve seçimi değişkene kaydeder savedRange.
restoreSelection()onfocusdiv olayına eklenir ve kaydedilen seçimi yeniden seçer savedRange.
Bu, kullanıcı div aswell'i tıkladığında seçimin geri yüklenmesini istemediğiniz sürece mükemmel şekilde çalışır (bu, normalde imlecin tıkladığınız yere gitmesini beklediğiniz gibi biraz mantıksızdır, ancak eksiksizlik için kod dahil edilmiştir)
Bunu başarmak için onclickve onmousedownolayları cancelEvent(), olayı iptal etmek için çapraz tarayıcı işlevi olan işlev tarafından iptal edilir . cancelEvent()Fonksiyon aynı zamanda çalışan restoreSelection()tıklama etkinlik iptal edilir olarak div odağı almaz ve bu fonksiyonlar çalıştırılır sürece bu nedenle hiçbir şey hiç seçilir çünkü fonksiyonu.
Değişken isInFocus, odakta olup olmadığını saklar ve "yanlış" onblurve "doğru" olarak değiştirilir onfocus. Bu, tıklama etkinliklerinin yalnızca div odakta değilse iptal edilmesini sağlar (aksi takdirde seçimi hiç değiştiremezsiniz).
Seçimi geri div bir tıklama ile odaklandığında değişiklik olmaması ve seçimdeki isterseniz onclick(ve odak elemanına verilen olduğunda programtically kullanarak document.getElementById("area").focus();veya benzeri daha sonra basitçe kaldırmak onclickve onmousedownolayları. onblurOlayını ve onDivBlur()ve cancelEvent()işlevleri bu durumlarda da güvenle kaldırılabilir.
Bu kod, hızlı bir şekilde test etmek istiyorsanız, doğrudan bir html sayfasının gövdesine bırakıldığında çalışmalıdır:
<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)
{
savedRange = window.getSelection().getRangeAt(0);
}
else if(document.selection)
{
savedRange = document.selection.createRange();
}
}
function restoreSelection()
{
isInFocus = true;
document.getElementById("area").focus();
if (savedRange != null) {
if (window.getSelection)
{
var s = window.getSelection();
if (s.rangeCount > 0)
s.removeAllRanges();
s.addRange(savedRange);
}
else if (document.createRange)
{
window.getSelection().addRange(savedRange);
}
else if (document.selection)
{
savedRange.select();
}
}
}
var isInFocus = false;
function onDivBlur()
{
isInFocus = false;
}
function cancelEvent(e)
{
if (isInFocus == false && savedRange != null) {
if (e && e.preventDefault) {
e.stopPropagation();
e.preventDefault();
}
else {
window.event.cancelBubble = true;
}
restoreSelection();
return false;
}
}
</script>
contentEditableIE olmayan tarayıcılarda çalıştığını bilmiyordum o_o