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