Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript designMode iFrame获取光标位置_Javascript_Iframe_Designmode - Fatal编程技术网

Javascript designMode iFrame获取光标位置

Javascript designMode iFrame获取光标位置,javascript,iframe,designmode,Javascript,Iframe,Designmode,我想获取可编辑iFrame的光标位置(使用设计模式)。以下是我目前掌握的代码: document.getElementById('iframe_id').contentWindow.document.getSelection().getRangeAt(0) 从那里,获取属性startOffset将获取该行开头的字符数,而不是iFrame文档开头的字符数。我想得到光标相对于文档开头的位置 请注意:我对设置光标位置不感兴趣;我只是想得到它 最好,我希望修复程序与Chrome/Safari/Fire

我想获取可编辑iFrame的光标位置(使用设计模式)。以下是我目前掌握的代码:

document.getElementById('iframe_id').contentWindow.document.getSelection().getRangeAt(0)
从那里,获取属性
startOffset
将获取该行开头的字符数,而不是iFrame文档开头的字符数。我想得到光标相对于文档开头的位置

请注意:我对设置光标位置不感兴趣;我只是想得到它

最好,我希望修复程序与Chrome/Safari/Firefox兼容;不需要与IE兼容

任何帮助都将不胜感激。

以下内容基于但经过修改,可用于任何文档中的选择(例如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) );
这对我有用

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