2009-12-02 11 views
2

Je rencontre un problème lors de la création de plusieurs instances d'un CKEditor dans une boîte de dialogue JQuery UI. La boîte de dialogue charge un formulaire distant via AJAX, l'objectif est donc de pouvoir fermer et rouvrir la boîte de dialogue et d'avoir une nouvelle instance de l'éditeur. Avec les options par défaut, lors de la réouverture de la boîte de dialogue, une erreur apparaît, indiquant qu'un éditeur portant ce nom existe déjà. J'ai donc essayé plusieurs méthodes de destruction de l'instance de l'éditeur et toutes résultent du même problème. Lorsque l'éditeur est rechargé, la zone de texte indique null et les boutons ne fonctionnent pas.Plusieurs instances de CKEditor (dans Safari)

Actuellement, je suis en utilisant cette méthode de détruire l'instance:

var instance = CKEDITOR.instances['test']; 
if (instance) { CKEDITOR.remove(CKEDITOR.instances['test']); } 

Je recréés la question avec quelques simples fichiers html disponible pour le téléchargement here.

EDIT: J'ai juste essayé d'utiliser deux fichiers distants avec une zone de texte qui a un nom différent et j'ai le même problème. Quand une boîte de dialogue est ouverte puis fermée, l'autre boîte de dialogue a un CKEditor "nul" lorsqu'elle est ouverte.

Aussi, apparemment, c'est seulement un problème dans Safari.

Répondre

0

ce que je fais:

var instance = CKEDITOR.instances['test']; 
instance.destroy(); 
instance = null; 
+1

Juste essayé, mais je me fais la même erreur. Je pense que cela doit avoir quelque chose à voir avec JQueryUI/AJAX. – seth

1

ce que je l'ai fait:

var CKeditors = {}; 
function loadEditors() { 
    var $editors = $("textarea.ckeditor"); 
    if ($editors.length) { 
     $editors.each(function() { 
      var editorID = $(this).attr("id"); 
      if(CKeditors[editorID]){ 
       CKeditors[editorID].destroy(); 
       CKeditors[editorID] = null; 
      } 

      var dst = editorID+'-element'; 
      var html = ''; 
      if($(this).val()){ 
       html = $(this).val(); 
      } 
      CKeditors[editorID] = CKEDITOR.appendTo(dst, {}, html); 
     }); 
     $("textarea.ckeditor").hide(); 
    } 
} 

function updateCKEditors() { 
    for(x in CKeditors){ 
     $("#"+x).val(CKeditors[x].getData()); 
    } 
} 

puis après ajax im faire succés

loadEditors()

et avant de soumettre la forme (par exemple en utilisant ajax):

updateCKEditors()

vous avez besoin de jQuery pour que cela fonctionne. C'est pour zend_forms, mais après quelques corrections devraient fonctionner aussi dans des formes normales. jouer avec 'dst' pour le faire.

1

Bit d'un ancien sujet, mais j'ai eu un problème similaire.

J'ai utilisé la solution d'activ ci-dessus, ce qui a très bien fonctionné! CKEDITOR.appendTo did't travailler pour moi, mais la prochaine modification légère à la fonction loadEditors il l'a fait:

function loadEditors() { 
    var $editors = $("textarea.ckeditor"); 
    if ($editors.length) { 
     $editors.each(function() { 
      var editorID = $(this).attr("id"); 
      if(CKeditors[editorID]){ 
       CKeditors[editorID].destroy(); 
       CKeditors[editorID] = null; 
      } 

      var dst = editorID+'-element'; 
      CKeditors[editorID] = CKEDITOR.replace(dst, {}); 
     }); 
    } 
}