Вот некоторый простой, наивный код для этого, который вполне может выполнить вашу задачу.Он не учитывает текст, который может быть сделан невидимым (например, CSS или находящимся внутри элемента или, например) и может иметь расхождения в браузере (т.е. IE по сравнению со всем остальным) с переносами строк, и не учитывает сжатые пробелы.(например, 2 или более последовательных пробела, свернутых в одно видимое пространство на странице).Тем не менее, он работает для вашего примера во всех основных браузерах.
Демонстрационная версия: http://jsfiddle.net/UuDpL/2/
Код:
function getSelectionCharOffsetsWithin(element) {
var start = 0, end = 0;
var sel, range, priorRange;
if (typeof window.getSelection != "undefined") {
range = window.getSelection().getRangeAt(0);
priorRange = range.cloneRange();
priorRange.selectNodeContents(element);
priorRange.setEnd(range.startContainer, range.startOffset);
start = priorRange.toString().length;
end = start + range.toString().length;
} else if (typeof document.selection != "undefined" &&
(sel = document.selection).type != "Control") {
range = sel.createRange();
priorRange = document.body.createTextRange();
priorRange.moveToElementText(element);
priorRange.setEndPoint("EndToStart", range);
start = priorRange.text.length;
end = start + range.text.length;
}
return {
start: start,
end: end
};
}
alert( getSelectionCharOffsetsWithin(document.body).start );