CKEditor instance already exists

前端 未结 30 3433
刺人心
刺人心 2020-11-27 11:24

I am using jquery dialogs to present forms (fetched via AJAX). On some forms I am using a CKEditor for the textareas. The editor displays fine on the first load.

Whe

相关标签:
30条回答
  • 2020-11-27 11:52
    var e= CKEDITOR.instances['sample'];
    e.destroy();
    e= null;
    
    0 讨论(0)
  • 2020-11-27 11:52

    i had the same problem with instances, i was looking everywhere and finally this implementation works for me:

    
    
        //set my instance id on a variable
    
        myinstance = CKEDITOR.instances['info'];
    
        //check if my instance already exist
    
        if (myinstance) { 
            CKEDITOR.remove(info)
        }
    
        //call ckeditor again
    
        $('#info').ckeditor({
            toolbar: 'Basic',
            entities: false,
            basicEntities: false
        });
    
    
    0 讨论(0)
  • 2020-11-27 11:52

    I chose to rename all instances instead of destroy/replace - since sometimes the AJAX loaded instance doesn't really replace the one on the core of the page... keeps more in RAM, but less conflict this way.

        if (CKEDITOR && CKEDITOR.instances) {
            for (var oldName in CKEDITOR.instances) {
                var newName = "ajax"+oldName;
                CKEDITOR.instances[newName] = CKEDITOR.instances[oldName];
                CKEDITOR.instances[newName].name = newName;
                delete CKEDITOR.instances[oldName];
            }
        }
    
    0 讨论(0)
  • 2020-11-27 11:52

    I am in the situation where I have to controls that spawn dialogs, each of them need to have a ckeditor embedded inside these dialogs. And it just so happens the text areas share the same id. (normally this is very bad practice, but I have 2 jqGrids, one of assigned items and another of unassigned items.) They share almost identical configuration. Thus, I am using common code to configure both.

    So, when I load a dialog, for adding rows, or for editing them, from either jqGrid; I must remove all instances of CKEDITOR in all textareas.

    $('textarea').each(function()
    {
        try 
        {
            if(CKEDITOR.instances[$(this)[0].id] != null)
            {
                CKEDITOR.instances[$(this)[0].id].destroy();
            }
        }
        catch(e)
        {
    
        }
    });
    

    This will loop over all textareas, and if there is a CKEDITOR instance, then destroy it.

    Alternatively if you use pure jQuery:

    $('textarea').each(function()
    {
        try 
        {
            $(this).ckeditorGet().destroy();
        }
        catch(e)
        {
    
        }
    });
    
    0 讨论(0)
  • 2020-11-27 11:52

    CKeditor 4.2.1

    There is a lot of answers here but for me I needed something more (bit dirty too so if anyone can improve please do). For me MODALs where my issue.

    I was rendering the CKEditor in a modal, using Foundation. Ideally I would have destoryed the editor upon closing, however I didn't want to mess with Foundation.

    I called delete, I tried remove and another method but this was what I finally settled with.

    I was using textarea's to populate not DIVs.

    My Solution

    //hard code the DIV removal (due to duplication of CKeditors on page however they didn't work)
    
        $("#cke_myckeditorname").remove();
    
    
         if (CKEDITOR.instances['myckeditorname']) {
                    delete CKEDITOR.instances['myckeditorname'];
                    CKEDITOR.replace('myckeditorname', GetCKEditorSettings());
                } else {
                    CKEDITOR.replace('myckeditorname', GetCKEditorSettings());
                }
    

    this was my method to return my specific formatting, which you might not want.

        function GetCKEditorSettings()
        {
           return {
                        linkShowAdvancedTab: false,
                        linkShowTargetTab: false,
                        removePlugins: 'elementspath,magicline',
                        extraAllowedContent: 'hr blockquote div',
                        fontSize_sizes: 'small/8px;normal/12px;large/16px;larger/24px;huge/36px;',
                        toolbar: [
                            ['FontSize'],
                            ['Bold', 'Italic', 'Underline', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink'],
                            ['Smiley']
                        ]
                    };
        }
    
    0 讨论(0)
  • 2020-11-27 11:53

    Perhaps this will help you out - I've done something similar using jquery, except I'm loading up an unknown number of ckeditor objects. It took my a while to stumble onto this - it's not clear in the documentation.

    function loadEditors() {
        var $editors = $("textarea.ckeditor");
        if ($editors.length) {
            $editors.each(function() {
                var editorID = $(this).attr("id");
                var instance = CKEDITOR.instances[editorID];
                if (instance) { instance.destroy(true); }
                CKEDITOR.replace(editorID);
            });
        }
    }
    

    And here is what I run to get the content from the editors:

        var $editors = $("textarea.ckeditor");
        if ($editors.length) {
            $editors.each(function() {
                var instance = CKEDITOR.instances[$(this).attr("id")];
                if (instance) { $(this).val(instance.getData()); }
            });
        }
    

    UPDATE: I've changed my answer to use the correct method - which is .destroy(). .remove() is meant to be internal, and was improperly documented at one point.

    0 讨论(0)
提交回复
热议问题