Diperbarui 5 September 2010
Melihat semua orang sepertinya diarahkan ke sini untuk masalah ini, saya menambahkan jawaban saya ke pertanyaan serupa, yang berisi kode yang sama dengan jawaban ini tetapi dengan latar belakang penuh bagi mereka yang tertarik:
Document.selection.createRange IE tidak termasuk memimpin atau mengikuti baris kosong
Untuk menghitung trailing line break sangat rumit di IE, dan saya belum melihat solusi yang melakukan ini dengan benar, termasuk jawaban lain untuk pertanyaan ini. Namun dimungkinkan, menggunakan fungsi berikut, yang akan mengembalikan Anda awal dan akhir seleksi (yang sama dalam kasus tanda sisipan) dalam suatu <textarea>
atau teks <input>
.
Perhatikan bahwa textarea harus memiliki fokus agar fungsi ini berfungsi dengan baik di IE. Jika ragu, hubungi metode textarea focus()
terlebih dahulu.
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
};
}