私のRangyライブラリは、IE < 9 および他のすべての主要なブラウザーでさまざまな API を統合し、getNodes()その Range オブジェクトに関数を提供することで、あなたの役割を果たします。
function getSelectedNodes() {
    var selectedNodes = [];
    var sel = rangy.getSelection();
    for (var i = 0; i < sel.rangeCount; ++i) {
        selectedNodes = selectedNodes.concat( sel.getRangeAt(i).getNodes() );
    }
    return selectedNodes;
}
選択したテキストを取得するのは、すべてのブラウザーで非常に簡単です。ランジーではただ
var selectedText = rangy.getSelection().toString();
ランジーなし:
function getSelectedText() {
    var sel, text = "";
    if (window.getSelection) {
        text = "" + window.getSelection();
    } else if ( (sel = document.selection) && sel.type == "Text") {
        text = sel.createRange().text;
    }
    return text;
}
node文字オフセットに関しては、選択範囲内の任意のノードに対してこのようなことを行うことができます。折りたたまれたスペース、CSS によって非表示にされたテキスト、CSS によって通常のドキュメント フローの外に配置されたテキスト、およびブロック要素によって暗示された改行<br>、およびその他の微妙な点は考慮されていないため、これは必ずしもドキュメント内の表示可能なテキストを表しているとは限りません。
var sel = rangy.getSelection();
var selRange = sel.getRangeAt(0);
var rangePrecedingNode = rangy.createRange();
rangePrecedingNode.setStart(selRange.startContainer, selRange.startOffset);
rangePrecedingNode.setEndBefore(node);
var startIndex = rangePrecedingNode.toString().length;
rangePrecedingNode.setEndAfter(node);
var endIndex = rangePrecedingNode.toString().length;
alert(startIndex + ", " + endIndex);