Sau đây sẽ trở lại với yếu tố container của đầu hoặc cuối ranh giới của vùng chọn hiện tại, sử dụng boolean isStart
để xác định xem bạn có muốn bắt đầu hoặc kết thúc ranh giới. Nó sẽ làm việc trong hầu hết các trình duyệt chính thống. Thêm các tính năng thử nghiệm để tăng cường độ bền.
function getSelectionBoundaryElement(isStart) {
var range, sel, container;
if (document.selection) {
range = document.selection.createRange();
range.collapse(isStart);
return range.parentElement();
} else {
sel = window.getSelection();
if (sel.getRangeAt) {
if (sel.rangeCount > 0) {
range = sel.getRangeAt(0);
}
} else {
// Old WebKit
range = document.createRange();
range.setStart(sel.anchorNode, sel.anchorOffset);
range.setEnd(sel.focusNode, sel.focusOffset);
// Handle the case when the selection was selected backwards (from the end to the start in the document)
if (range.collapsed !== sel.isCollapsed) {
range.setStart(sel.focusNode, sel.focusOffset);
range.setEnd(sel.anchorNode, sel.anchorOffset);
}
}
if (range) {
container = range[isStart ? "startContainer" : "endContainer"];
// Check if the container is a text node and return its parent if so
return container.nodeType === 3 ? container.parentNode : container;
}
}
}
Nguồn
2009-08-26 19:22:42
Điều này sẽ cho kết quả không nhất quán giữa các trình duyệt và không trả lời câu hỏi gốc. Trong IE, bạn nhận được phần tử chứa toàn bộ lựa chọn, trong khi trong các trình duyệt khác, bạn sẽ nhận được cha của nút có chứa sự bắt đầu của lựa chọn (có thể là một nút văn bản hoặc một phần tử). –