このキャレット位置のトリックに基づく方法を使用します。
// Assume r is a range:
var offsetFromBody = Math.abs( r.moveEnd('character', -1000000) );
moveEnd は実際に移動した文字数を返すため、offset はドキュメントの先頭からのオフセットになります。これは、プリミティブ キャレットの動きをテストする場合には問題なく機能しますが、選択範囲を拡張し、範囲アンカーを保持する正確なノードを取得するには、もっと複雑なものが必要になります。
// 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) );
}
これにより、正しいキャレット テキスト オフセットが返されます。もちろん、ターゲットノードがすでにわかっている場合、またはコンテキストを提供できる場合は、ループ検索の混乱全体をスキップできます。