Способ сделать это в браузерах, отличных от IE, - получить объект Range
из выбора . Диапазон имеет начальную и конечную границы, и каждая граница диапазона выражается как смещение внутри узла; если граница находится внутри текстового узла, это смещение будет смещением символа.
Например, если ниже был текстовый узел, а выделение разделено трубами:
"red |widget| blue widget"
... тогда диапазон, который вы получите из выделения, будет иметь начальное смещение 4 в текстовом узле.
Следующее даст вам Range, представляющий выделение, и предупредит начальную границу:
var sel = window.getSelection();
var selectedRange = sel.rangeCount ? sel.getRangeAt(0) : null;
if (range) {
alert("Offset " + selectedRange.startOffset
+ " in node " + selectedRange.startContainer.nodeName);
}
Диапазоны можно сравнивать с другими диапазонами, поэтому, если вы хотите узнать, например, был ли текущий выбор после слова «синий» в указанном выше текстовом узле, вы можете создать диапазон, включающий слово «синий» и сравнить его с выбранным диапазоном:
// Assume the text node is stored in a variable called textNode
var blueRange = document.createRange();
blueRange.setStart(textNode, 11);
blueRange.setEnd(textNode, 15);
var selectionIsAfterBlue =
(selectedRange.compareBoundaryPoints(Range.END_TO_START, blueRange) == 1);
В IE ничего из этого не работает, и все делается по-другому, как правило, с гораздо большими трудностями. Чтобы нормализовать это для единого согласованного интерфейса, вы можете использовать мою библиотеку Rangy .