【问题标题】:Tinymce IE6+ How can I get a working range?Tinymce IE6+ 如何获得工作范围?
【发布时间】:2009-10-15 01:46:29
【问题描述】:

我一直在寻找试图找出为什么 IE 不会保存当前插入符号位置然后重新加载它。为了描述情况,它的工作原理如下:

客户希望使用 ajax 图像加载器定制 Tinymce,该加载器本质上很简单,任何“白痴”都可以上传并在文本编辑器中为图像设置一些设置,使其看起来不错。我们有很多客户喜欢从 word 中粘贴,而 fckeditor 只是不再剪切它了。无论如何,ajax/上传器都可以完美运行。将图像输入编辑器时出现问题。 FF/Opera/Crome 等,完美运行,但 IE 肯定有问题。

这就是我需要回答的问题,Tinymce 失去焦点,因为弹出一个 jQuery 对话框进行上传(这个功能不能作为插件开发,他们需要外部工具,所以没有 tinyMCEPopUp 类/函数可以工作,所以我不能简单地调用 tinyMCEPopup.restore()) 我需要保存图像的插入符号位置/选择并存储它/通过某些函数传递它,并在放置时恢复选择。

我已经尝试了数百种方法,只有一种方法获得了正确的选择长度,但光标仍然位于 pos 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.activeEditor.selection.getBookmark()?我认为这很可能是您需要的,您可能只是在错误的时间调用它。
  • 我在设置里面调用它书签,甚至在调用 jQuery 对话框之前,所以有焦点。

标签: javascript dom internet-explorer tinymce range


【解决方案1】:

我仍然认为 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);
      }
     }
    }

【讨论】:

  • 非常感谢,工作完美!这解决了一个主要的头痛问题,再次感谢非常感谢。
  • 天哪!非常感谢你发布这个!在过去的 6 个小时里,我一直在尝试各种巫术来让我的 jquery 对话框在正确的位置将图像发送到 wordpress edior。一切都在 chrome 和 FF 中工作,但 IE 拒绝将插入的内容定位在插入符号位置。感谢@Dreamcube 用足够多的可识别短语提出了这个问题,以便在谷歌搜索 Tim Down 中找到它——我对你好先生脱帽致敬
  • @CommentLuv: 乐于助人:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 2021-01-27
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多