CKEditor无法从iframe获取当前实例

CKEditor cannot get current instance from iframe

本文关键字:实例 获取 iframe CKEditor      更新时间:2023-09-26

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

这是javascript在主页html

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

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

问题是i 不能得到当前活动CKEditor插入元素与insertElement命令。

CKEDITOR。当前实例未定义或为null

window.parent.CKEDITOR。当前实例未定义或为null

如何从iframe获得当前活动CKEditor ?


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

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

然而,如果你正在使用CKEditor的对话框(你吗?)编辑器实例应该始终是活跃的,当这个对话框为它打开。如果这是您的情况,那么您需要向我们提供一个工作示例,因为很难猜测哪里可能出错。

第二个选项是,你不使用CKEditor的对话框,然后你必须照顾注册该iframe到CKEditor的focusManager,虽然这是棘手的,所以你宁愿不使用CKEditor的第三方对话框。

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

我想这样做

    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;
        }
    }

CKEditor是null/undefined,如Reinmar所说。

现在我可以找到工作的方式与当前实例,即使你点击外部CKEditor。

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

我所做的是…

  1. 在javascript (in html)中为当前实例添加全局变量
  2. 点击打开模式对话框按钮,获取当前实例并设置为选择1中的全局变量。
  3. 在模态对话框中单击iframe插入按钮,获取window.parent。Current_instance变量并用作texteditor id。( var parent_cke_current_id = window.parent.current_instance_id;)
  4. 现在做任何你想点击CKEditor实例。例如(CKEDITOR.instances[parent_cke_current_id].insertElement(element);)

谢谢你,Reinmar。