3

編集可能な iFrame のカーソル位置を取得したい (designMode を使用)。これが私がこれまでに持っているコードです:

document.getElementById('iframe_id').contentWindow.document.getSelection().getRangeAt(0)

そこからプロパティstartOffsetを取得すると、その行の先頭からの文字数が取得されますが、iFrame ドキュメントの先頭からは取得されません。ドキュメントの先頭に対するカーソル位置を取得したいと思います。

注意:カーソル位置の設定には興味がありません。私はそれを手に入れたいだけです。

できれば、修正が Chrome/Safari/Firefox と互換性があることを望みます。IE との互換性は必要ありません。

どんな助けでも大歓迎です。

4

2 に答える 2

6

以下はこの回答に基づいていますが、任意のドキュメント (iframe 内のドキュメントなど) の選択で動作するように変更されています。その回答で説明されているこのアプローチの素朴さに関する同じ警告が引き続き適用されます。

function getCaretCharacterOffsetWithin(element) {
    var doc = element.ownerDocument || element.document;
    var win = doc.defaultView || doc.parentWindow;
    var sel, range, preCaretRange, caretOffset = 0;
    if (typeof win.getSelection != "undefined") {
        sel = win.getSelection();
        if (sel.rangeCount) {
            range = sel.getRangeAt(0);
            preCaretRange = range.cloneRange();
            preCaretRange.selectNodeContents(element);
            preCaretRange.setEnd(range.endContainer, range.endOffset);
            caretOffset = preCaretRange.toString().length;
        }
    } else if ( (sel = doc.selection) && sel.type != "Control") {
        range = doc.selection.createRange();
        preCaretRange = doc.body.createTextRange();
        preCaretRange.moveToElementText(element);
        preCaretRange.setEndPoint("EndToEnd", textRange);
        caretOffset = preCaretTextRange.text.length;
    }
    return caretOffset;
}

使用例:

var iframe = document.getElementById("foo");
var iframeBody = (iframe.contentDocument || iframe.contentWindow.document).body;
alert( getCaretCharacterOffsetWithin(iframeBody) );
于 2012-01-06T12:02:30.257 に答える
-1

これは私のために働いた

function getCaretPosition() {
var element = document.idEditbox.document.body; // just my content IFRAME
var doc = element.ownerDocument || element.document;
var win = doc.defaultView || doc.parentWindow;
var sel, range, preCaretRange, caretOffset = 0;
if (typeof win.getSelection != "undefined") {
    sel = win.getSelection();
    if (sel.rangeCount) {
        range = sel.getRangeAt(0);
        preCaretRange = range.cloneRange();
        preCaretRange.selectNodeContents(element);
        preCaretRange.setEnd(range.endContainer, range.endOffset);
        caretOffset = preCaretRange.toString().length;
    }
} else if ( (sel = doc.selection) && sel.type != "Control") {
    range = doc.selection.createRange();
var tempRange = range.duplicate();
    preCaretRange = doc.body.createTextRange();
    preCaretRange.moveToElementText(element);
    preCaretRange.setEndPoint("EndToEnd", tempRange);
    caretOffset = preCaretRange.text.length;
}
return caretOffset;

}

于 2014-02-02T19:10:25.147 に答える