Güncellendi 5 Eylül 2010
Herkesin bu sorun için burada yönlendirilmiş gibi göründüğüne göre, bu cevapla aynı kodu içeren ancak ilgilenenler için tam arka plana sahip benzer bir soruya cevabımı ekliyorum:
IE'nin document.selection.createRange, önde gelen veya sondaki boş satırları içermez
Sondaki satır sonlarını hesaba katmak IE'de zor ve bu soruya verilen diğer yanıtlar da dahil olmak üzere bunu doğru yapan herhangi bir çözüm görmedim. Bununla birlikte, bir <textarea>
veya metin içinde seçimin başlangıcını ve sonunu (bir düzeltme durumunda aynıdır) döndüren aşağıdaki işlevi kullanarak mümkündür <input>
.
IE'de bu işlevin düzgün çalışması için metin alanının odağa sahip olması gerektiğini unutmayın. Şüpheniz varsa, önce textarea focus()
yöntemini çağırın .
function getInputSelection(el) {
var start = 0, end = 0, normalizedValue, range,
textInputRange, len, endRange;
if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") {
start = el.selectionStart;
end = el.selectionEnd;
} else {
range = document.selection.createRange();
if (range && range.parentElement() == el) {
len = el.value.length;
normalizedValue = el.value.replace(/\r\n/g, "\n");
// Create a working TextRange that lives only in the input
textInputRange = el.createTextRange();
textInputRange.moveToBookmark(range.getBookmark());
// Check if the start and end of the selection are at the very end
// of the input, since moveStart/moveEnd doesn't return what we want
// in those cases
endRange = el.createTextRange();
endRange.collapse(false);
if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
start = end = len;
} else {
start = -textInputRange.moveStart("character", -len);
start += normalizedValue.slice(0, start).split("\n").length - 1;
if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
end = len;
} else {
end = -textInputRange.moveEnd("character", -len);
end += normalizedValue.slice(0, end).split("\n").length - 1;
}
}
}
}
return {
start: start,
end: end
};
}