El siguiente devolverá el elemento contenedor de inicio o al final límite de la selección actual, usando el booleano isStart
para especificar si desea que el límite de inicio o al final. Funcionará en la mayoría de los navegadores convencionales. Agregue pruebas de características para mayor robustez.
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;
}
}
}
Esto dará resultados inconsistentes entre los navegadores y no responde la pregunta original. En IE obtienes el elemento que contiene toda la selección, mientras que en otros buscadores obtendrás el padre del nodo que contiene el inicio de la selección (que podría ser un nodo de texto o un elemento). –