CKEditor无法从iframe获取当前实例

时间:2013-05-23 14:29:43

标签: javascript iframe ckeditor

CKEditor 4或以上

我有表格>具有CKEditor功能的te​​xtarea。

我在模态对话框中有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

3 个答案:

答案 0 :(得分:3)

如果CKEDITOR.currentInstancenull/undefined,则没有任何编辑器实例处于活动状态。这意味着您将焦点从编辑器移到了无法识别的位置。

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

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

编辑当我点击“测试”按钮时,test_current功能正常工作,但必须重点关注编辑器。但是,从您点击按钮编辑器的那一刻起200ms后,您将无法从currentInstance获得它。为了避免在单击按钮时出现模糊编辑器,您需要在focusManagers中注册它(如果它们将与两者一起使用,则需要在两个编辑器中注册)。

答案 1 :(得分: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;
        }
    }

答案 2 :(得分:0)

如Reinmar所说,CKEditor为null / undefined。

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

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

我做的是......

  1. 在javascript中添加当前实例的全局变量(在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);
  5. 谢谢Reinmar。

相关问题