Im Folgenden wird der Behälter Element der Anfang oder das Ende Grenze der aktuellen Auswahl zurückkehren, die boolean isStart
mit angeben, ob Sie den Anfang oder das Ende Grenze wollen. Es wird in den meisten gängigen Browsern funktionieren. Fügen Sie Funktionstests für mehr Robustheit hinzu.
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;
}
}
}
Dies führt zu inkonsistenten Ergebnissen zwischen Browsern und beantwortet die ursprüngliche Frage nicht. In IE erhalten Sie das Element, das die gesamte Auswahl enthält, während Sie in anderen Browsern das Elternelement des Knotens erhalten, der den Start der Auswahl enthält (was ein Textknoten oder ein Element sein könnte). –