99 votes

CKEditor instance existe déjà

Je suis à l'aide de jquery boîtes de dialogue pour présenter des formulaires (récupéré via AJAX). Sur quelques formes que j'utilise CKEditor pour les textareas. L'éditeur affiche bien sur la première charge.

Lorsque l'utilisateur annule la boîte de dialogue, je suis de retirer le contenu, de sorte qu'ils sont chargés frais sur une demande ultérieure. La question est, une fois que le dialogue est rechargé, l'CKEditor revendications de l'éditeur existe déjà.

uncaught exception: [CKEDITOR.editor] The instance "textarea_name" already exists.

L'API comprend une méthode pour détruire les éditeurs, et j'ai vu des gens affirment que ce est une solution:

if (CKEDITOR.instances['textarea_name']) {
CKEDITOR.instances['textarea_name'].destroy();
}
CKEDITOR.replace('textarea_name');

Ce n'est pas de travail pour moi, lorsque je reçois un nouveau message d'erreur à la place:

TypeError: Result of expression 'i.contentWindow' [null] is not an object.

Cette erreur semble se produire sur la "destroy()" plutôt que le "replace()". Quelqu'un at-il vécu cela et trouvé une autre solution?

Il est possible de "re-rendu de" l'éditeur existant, plutôt que de détruire et de le remplacer?

Mise à JOUR Voici une autre question à traiter le même problème, mais il a fourni une téléchargeables cas de test.

102voto

Tomas Kirda Points 3548

Pour que cela fonctionne, vous devez passer le paramètre booléen true lorsque l’instance de détruire :

28voto

Jim Points 309
function loadEditor(id)
{
    var instance = CKEDITOR.instances[id];
    if(instance)
    {
        CKEDITOR.remove(instance);
    }
    CKEDITOR.replace(id);
}

19voto

Smickie Points 815

J'ai eu ce problème aussi, mais je l'ai résolu de façon beaucoup plus simple...

J'ai été en utilisant la classe ".ckeditor" dans le jQuery que le sélecteur pour qui textares je voulais ckeditorized.

La valeur par défaut ckeditor js-vous d'inclure avant l'utilise également cette classe pour identifier les textareas à ckeditoriz. Cela signifie à la fois votre jQuery ckeditor la fonction et la valeur par défaut ckeditor js essayez d'exécuter sur le textarea.

Ce que vous devez faire est de simplement changer la classe de jQuery, j'utilise".do_ckeditor "et d'enlever le "ckeditor" classe à partir de votre code html.

Je tirais mes cheveux à ce sujet et a senti le besoin de revenir et de poster cette réponse.

Espérons que cette aide.

11voto

adu Points 461

Il s’agit de la solution plus simple (et unique) qui a fonctionné pour moi :

Supprimer cette entrée dans le tableau empêche cette vérification de sécurité forme de détruire votre application.

Destroy() et remove() n’a pas fonctionné pour moi.

7voto

ScottE Points 11633

Peut-être cela vous aidera - j'ai fait quelque chose de similaire à l'aide de jquery, sauf que je suis en charge d'un nombre inconnu de ckeditor objets. Il a pris mon temps pour tomber sur celui - ci; il n'est pas clair dans la 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);
        });
    }
}

Et voici ce que j'en course pour obtenir le contenu de la rédaction:

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

Mise à JOUR: j'ai changé ma réponse d'utiliser la bonne méthode .destroy(). .remove() est censé être interne, et a été mal documentés à un moment donné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X