あなたが話していることは、 Internet Explorer を除くすべての主要なブラウザーに実装されているDOM Rangeのようなものです。innerHTML の実装は大きく異なるため、HTML 内の文字オフセットの観点から位置を指定することはお勧めできません。DOM 範囲には開始境界と終了境界があり、それぞれがノードとそのノード内のオフセットに関して指定されます。あなたの例の場合、場所を表す Range を作成できます。
var span = pNode.childNodes[1];
var spanText = span.firstChild;
var range = document.createRange();
// Next line takes into account whitespace at the start of the text node
range.setStart(spanText, 6);
// For illustration, create a range that contains the letter "a" and selects it
range.setEnd(spanText, 7);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
Range を取得したら、ノードの挿入、ユーザー選択の定義、Range によってカプセル化されたコンテンツへのフォーマットの適用など、さまざまなことに使用できます。
IE は、 TextRangeと呼ばれるまったく異なるオブジェクトを定義します。これは、根本的に異なるテキストベースのアプローチを持ちますが、ほとんど同じ目的を果たします。前の例と同等の TextRange を取得するには、次を使用できます。
var textRange = document.body.createTextRange();
textRange.moveToElementText(pNode);
textRange.moveStart("character", 17);
textRange.collapse();
// For illustration, create a range that contains the letter "a" and selects it
textRange.moveEnd("character", 1);
textRange.select();