Придется вручную считать.
Сначала взять range:
if( selection.rangeCount ) {
var range = selection.getRangeAt(0);
...
}
потом выяснить, является ли
range.commonAncestorContainer твоим спаном или его потомком (если нет, то выделение выскочило за границы спана).
ну и далее разбираться со свойствами range (startContainer, endContainer, startOffset, endOffset). а именно, посчитать суммарную длину текста всех текстовых узлов до startContainer, добавить туда же все <br> (их считаем как один символ), то же самое между startContainer и endContainer и т.д.
может оказаться, что startContainer и/или endContainer окажутся спаном, тогда оффсеты соответствуют позиции чилда.
короче, тут много всяких деталей.
Тут все расписано. Если тебе ещё и для IE надо делать, то вообще "везунчик"