我一直在寻找,试图弄清楚为什么 IE 不保存当前插入符位置然后重新加载它。为了描述这种情况,它是这样工作的:
客户希望使用 ajax 图像加载器自定义构建 Tinymce,该加载器本质上非常简单,任何“白痴”都可以上传并在文本编辑器中为图像设置一些设置,并使其看起来不错。我们有很多客户只喜欢从 word 中粘贴,而 fckeditor 只是不再剪切它了。无论如何,ajax/ uploader 都可以完美运行。将图像输入编辑器时就会出现问题。 FF/Opera/Crome 等,工作完美,但 IE 当然有问题。
这是我需要回答的问题,Tinymce 失去焦点是因为弹出了一个用于上传的 jQuery 对话框(这个功能不能作为插件开发,他们需要外部工具,所以没有 tinyMCEPopUp 类/函数可以工作所以我不能简单地调用 tinyMCEPopup.restore()) 我需要保存图像的插入符号位置/选择并存储它/通过一些函数传递它,并在放置它时恢复选择。
我已经尝试了数百种方法,只有一种方法获得了正确的选择长度,但光标仍然位于位置 0。这在 IE 中创建范围对象时有效
if(document.selection) {
b = document.getElementById('txtarea');
range = b.createTextRange();
//the rest of the jaz
}
许多消息来源告诉我,从 DOM 获取它是行不通的,因为 Tinymce 是在 iframe 中构建的,但 createRange() 目前也没有存储。如果有人知道或找到解决方法,我将不胜感激,我已经绞尽脑汁花了 16 个小时的开发时间,试图在没有可用解决方案的情况下解决这个问题。使用 tinyMCE.activeEditor.selection.getBookmark() 也没有骰子。我的 Javascript 水平一般,我知道自己的方法,但这绝对不是我的强项,PHP/后端/软件开发才是。所以当有一个简单的解决方案时,可能只是我愚蠢。
感谢您的宝贵时间。
最佳答案
我仍然认为 TinyMCE 会为您做这件事,但我不是这方面的专家并且现在(也许以后)没有时间玩它。不过,我知道选择和范围,因此您可以根据自己的目的调整以下功能。您需要将编辑器 iframe 的 window
对象传递到两个函数中:
function saveSelection(win) {
var doc = win.document;
var sel = win.getSelection ? win.getSelection() : doc.selection;
var range;
if (sel) {
if (sel.createRange) {
range = sel.createRange();
} else if (sel.getRangeAt) {
range = sel.getRangeAt(0);
} else if (sel.anchorNode && sel.focusNode && doc.createRange) {
// Older WebKit browsers
range = doc.createRange();
range.setStart(sel.anchorNode, sel.anchorOffset);
range.setEnd(sel.focusNode, sel.focusOffset);
// Handle the case when the selection was selected backwards (from the end to the start in the
// document)
if (range.collapsed !== sel.isCollapsed) {
range.setStart(sel.focusNode, sel.focusOffset);
range.setEnd(sel.anchorNode, sel.anchorOffset);
}
}
}
return range;
}
function restoreSelection(win, range) {
var doc = win.document;
var sel = win.getSelection ? win.getSelection() : doc.selection;
if (sel && range) {
if (range.select) {
range.select();
} else if (sel.removeAllRanges && sel.addRange) {
sel.removeAllRanges();
sel.addRange(range);
}
}
}
关于javascript - Tinymce IE6+ 如何获得工作范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1569897/