Bu çözüm tüm büyük tarayıcılarda çalışır:
saveSelection()
div'in onmouseup
ve onkeyup
olaylarına eklenir ve seçimi değişkene kaydeder savedRange
.
restoreSelection()
onfocus
div 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 onclick
ve onmousedown
olayları 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ış" onblur
ve "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 onclick
ve onmousedown
olayları. onblur
Olayı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>
contentEditable
IE olmayan tarayıcılarda çalıştığını bilmiyordum o_o