首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CKEditor无法从iframe获取当前实例

CKEditor无法从iframe获取当前实例
EN

Stack Overflow用户
提问于 2013-05-23 14:29:43
回答 3查看 3.9K关注 0票数 1

CKEditor 4或以上

我有表单> textarea,启用了CKEditor并运行。

我在模式对话框中有iframe,在iframe按钮中有insert_media() javascript函数。

代码语言:javascript
复制
function insert_media( element ) {
    // get element html decode
    element = htmlspecialchars_decode( element, 'ENT_QUOTES' );
    // htmlspecialchars_decode is external function.

    // CKEditor insert element ---------------------------------------------
    // use .insertElement()
    var CKEDITOR = window.parent.CKEDITOR;
    var element = CKEDITOR.dom.element.createFromHtml(element);

    // body_value is name of textarea
    // this code only works with specific textarea NOT current active textarea
    //CKEDITOR.instances.body_value.insertElement(element);

    var current_instance_ckeditor = window.parent.test_current();
    // CKEditor insert element ---------------------------------------------

    // close modal dialog at parent window
    window.parent.close_dialog();

    // done
    return false;
}// insert_media

这是主页html中的javascript。

代码语言:javascript
复制
function close_dialog() {
    $('#media-modal').modal('hide');
}// close_dialog


function test_current() {
    console.log( CKEDITOR.currentInstance.name );
}

问题是,I无法使当前的active CKEditor使用insertElement命令插入元素。

CKEDITOR.currentInstance是未定义或空的。

window.parent.CKEDITOR.currentInstance是未定义或空的。

如何从iframe中获取当前活动CKEditor

测试文件:http://www.megafileupload.com/en/file/420060/test-ckeditor-zip.html

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-23 15:21:18

如果CKEDITOR.currentInstancenull/undefined,那么没有一个编辑器实例是活动的。这意味着你把焦点从编辑转移到了不被认可的地方。

但是,如果您使用的是CKEditor的对话框(是吗?)当打开该对话框时,编辑器实例应该始终处于活动状态。如果这是你的情况,那么你需要给我们一个工作的例子,因为它很难猜测什么可能是错误的。

第二个选项是,您不使用CKEditor的对话框,然后您必须负责将该对话框注册到CKEditor的focusManager,尽管这很棘手,所以您不应该在CKEditor中使用第三方的对话框。

编辑当我点击“测试”按钮时,test_current函数可以正常工作,但是编辑器必须有重点。但是,从你点击按钮的那一刻起,200毫秒以后,编辑器就会变得模糊,你将无法从currentInstance获得它。为了避免在单击按钮时模糊编辑器,您需要在focusManagers中注册它(如果同时使用这两个编辑器,则两个编辑器都注册)。

票数 3
EN

Stack Overflow用户

发布于 2013-09-05 13:52:27

我会这样做

代码语言:javascript
复制
    var ck_instance_name = false;
    for ( var ck_instance in CKEDITOR.instances ){
        if (CKEDITOR.instances[ck_instance].focusManager.hasFocus){
            ck_instance_name = ck_instance;
            return ck_instance_name;
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2013-09-06 18:33:54

正如Reinmar所说,CKEditor是空/未定义的。

现在,我可以找到使用当前实例的方法,即使您单击了CKEditor外部。

这是供测试的示例文件。http://www.megafileupload.com/en/file/448409/test-ckeditor-zip.html

我所做的就是..。

  1. 在javascript ( html)中为当前实例添加全局变量
  2. 在打开模式对话框的单击按钮上,获取当前实例并在选择1中设置为全局变量。
  3. 单击“模态对话框中的iframe”中的“插入”按钮,获取window.parent.current_instance变量并将其用作文本id。(var parent_cke_current_id = window.parent.current_instance_id;)
  4. 现在,使用单击的CKEditor实例执行您想做的任何事情。例如(CKEDITOR.instances[parent_cke_current_id].insertElement(element);)

谢谢Reinmar。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16716642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档