javascript - Tinymce IE6+ 如何获得工作范围?

标签 javascript dom internet-explorer tinymce range

我一直在寻找,试图弄清楚为什么 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/

相关文章:

javascript - IE 在 Zurb Foundation.min.js 中抛出 `Object doesn' t 支持属性或方法 'defineProperty' `。有修复或解决方法吗?

javascript - 初始化键值对 Javascript 对象

javascript - 如何检测悬停时的前一个元素?

javascript - Phonegap 中的社交登录

javascript - 查找跨时区的兼容时间

java - 如何在java中的某个元素之后/之前将元素插入到xml中

java - Java中的XML文件读取

url - 仅通过 jQuery 从 url 获取元标记

internet-explorer - 程序下载 - IE CHROME - "is not commonly downloaded and could be dangerous."

javascript - IE6 中的 "Member not found"错误 : from . 样式编辑或 getElementById 或...?