designMode iFrame获取光标位置

designMode iFrame获取光标位置

问题描述:

我想获取可编辑的iFrame的光标位置(使用designMode)。这里是我到目前为止的代码:designMode iFrame获取光标位置

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

从那里获取属性startOffset获取的字符数,从该行的开始,而不是从文件的iFrame的开始。我想获得相对于文档开头的光标位置。

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

最好,我想修复程序与Chrome/Safari/Firefox兼容;与IE的兼容性是没有必要的。

任何帮助将不胜感激。

以下内容基于this answer,但已修改为可在任何文档(例如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; 

}