Я использую метод, основанный на этой уловке положения каретки:
// Assume r is a range:
var offsetFromBody = Math.abs( r.moveEnd('character', -1000000) );
Поскольку moveEnd возвращает количество фактически перемещенных символов, смещение теперь должно быть смещением от начала документа. Это прекрасно работает для тестирования движения примитивной каретки, но для расширенного выбора и для получения точного узла, который содержит привязку диапазона, вам понадобится нечто более сложное:
// where paramter r is a range:
function getRangeOffsetIE( r ) {
var end = Math.abs( r.duplicate().moveEnd('character', -1000000) );
// find the anchor element's offset
var range = r.duplicate();
r.collapse( false );
var parentElm = range.parentElement();
var children = parentElm.getElementsByTagName('*');
for (var i = children.length - 1; i >= 0; i--) {
range.moveToElementText( children[i] );
if ( range.inRange(r) ) {
parentElm = children[i];
break;
}
}
range.moveToElementText( parentElm );
return end - Math.abs( range.moveStart('character', -1000000) );
}
Это должно вернуть правильное смещение текста каретки. Конечно, если вы уже знаете целевой узел или можете предоставить контекст, вы можете пропустить весь цикл поиска зацикливания.