1

CKEditor 4 或以上

我有启用 CKEditor 并运行的表单 > 文本区域。

我在模态对话框中有 iframe,在 iframe 里面是带有 insert_media() 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

function close_dialog() {
    $('#media-modal').modal('hide');
}// close_dialog


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

问题是我无法让当前活动的 CKEditor使用 insertElement 命令插入元素。

CKEDITOR.currentInstance 未定义或为空

window.parent.CKEDITOR.currentInstance 未定义或为空

如何从 iframe获取当前活动的 CKEditor ?


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

4

3 回答 3

3

如果CKEDITOR.currentInstancenull/undefined,则没有一个编辑器实例处于活动状态。这意味着您将焦点从编辑器移到了未被识别为它的部分的地方。

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

第二种选择是您不使用 CKEditor 的对话框,然后您必须注意将该 iframe 注册到 CKEditor 的focusManager,尽管这很棘手,因此您不应该使用 CKEditor 的第 3 方对话框。

编辑当我单击“测试”按钮时,该test_current功能工作正常,但编辑器必须集中。但是从您单击按钮编辑器的那一刻起 200 毫秒后,您将无法从currentInstance. 为避免在单击按钮时使编辑器模糊,您需要在两个编辑器中注册它focusManagers(如果它将与两个编辑器一起使用)。

于 2013-05-23T15:21:18.320 回答
0

正如 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);)

谢谢你莱因马尔。

于 2013-09-06T18:33:54.173 回答
0

我会这样做

    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;
        }
    }
于 2013-09-05T13:52:27.707 回答