Cập nhật ngày 5 tháng 9 năm 2010
Thấy mọi người dường như được hướng dẫn ở đây về vấn đề này, tôi đang thêm câu trả lời của mình cho một câu hỏi tương tự, trong đó có cùng mã với câu trả lời này nhưng với nền tảng đầy đủ cho những người quan tâm:
Tài liệu của IE.selection.createRange không bao gồm các dòng trống hàng đầu hoặc dấu
Để giải thích cho việc ngắt dòng là khó khăn trong IE và tôi chưa thấy giải pháp nào thực hiện chính xác, bao gồm mọi câu trả lời khác cho câu hỏi này. Tuy nhiên, có thể sử dụng chức năng sau, sẽ trả về cho bạn điểm bắt đầu và kết thúc của lựa chọn (tương tự trong trường hợp dấu mũ) trong một <textarea>
hoặc văn bản <input>
.
Lưu ý rằng textarea phải có trọng tâm để chức năng này hoạt động chính xác trong IE. Nếu nghi ngờ, hãy gọi focus()
phương thức của textarea trước.
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
};
}