简体   繁体   English

designMode iFrame获取光标位置

[英]designMode iFrame Get Cursor Position

I want to get the cursor position of an editable iFrame (using designMode). 我想获取一个可编辑iFrame的光标位置(使用designMode)。 Here is the code I have so far: 这是我到目前为止的代码:

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

From there, getting the property startOffset gets the number of characters from the beginning of that line, but not from the beginning of the iFrame document. 从那里开始,获取属性startOffset将从该行的开头而不是iFrame文档的开头获取字符数。 I would like to get the cursor position relative to the beginning of the document. 我想获得相对于文档开头的光标位置。

Please note: I am not interested in setting the cursor position ; 请注意:我对设置光标位置 感兴趣; I just want to get it. 我只想要得到它。

Preferably, I would like the fix to be compatible with Chrome/Safari/Firefox; 最好,我希望该修复程序与Chrome / Safari / Firefox兼容; compatibility with IE is not necessary. 无需与IE兼容。

Any help would be greatly appreciated. 任何帮助将不胜感激。

The following is based on this answer but is modified to work with selections in any document (such as one in an iframe). 以下内容基于此答案,但经过修改后可以处理任何文档中的选择(例如iframe中的选择)。 The same caveats about the naïveté of this approach laid out in that answer still apply. 在该答案中提出的关于这种方法的天真的警告同样适用。

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;
}

Example usage: 用法示例:

var iframe = document.getElementById("foo");
var iframeBody = (iframe.contentDocument || iframe.contentWindow.document).body;
alert( getCaretCharacterOffsetWithin(iframeBody) );

This worked for me 这对我有用

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;

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM