2011-11-01 4 views
9

Leyendo a través del CKEditor documentation, veo que tienen una opción para destruir una instancia con CKEDITOR.instances.instanceName.destroy();. Sin embargo, si el DOM ha cambiado, y toda la estructura WYSIWYG DOM se ha eliminado, me sale el siguiente error en Chrome:CKEditor: destruya una instancia cuando se haya eliminado el nodo DOM

Uncaught TypeError: Cannot read property 'document' of null 

... y el siguiente en Firefox:

i.contentWindow is null 

¿Hay alguna forma de evitar esto?

Debido a la forma en que está estructurada mi aplicación (carga de contenido a través de AJAX), no puedo llamar al .destroy() cuando los elementos todavía están en la página.

Respuesta

16

Si necesita destruir el objeto ckeditor y los elemnets en el DOM DESPUÉS de una llamada AJAX, puede hacerlo configurando un parámetro booleano para la función llamada destroy (true). De esta manera no lo puedo tratar de actualizar el DOM:

var editor = CKEDITOR.instances[name]; 
if (editor) { editor.destroy(true); } 
CKEDITOR.replace(name); 

he escrito 2 funciones para poder controlar estas cosas un poco mejor. Tenga en cuenta que he declarado una variable antes de que estas funciones se pueden utilizar, pero hay maneras mucho más pulidos, pero este enfoque era lo suficientemente bueno para el propósito que lo necesitaba (yo uso y necesita sólo un ejemplo):

if(typeof(editor) == 'undefined') 
     var editor=null; 

    function ck_delete(editor) 
    { 
     if(typeof(editor) != 'undefined' && editor!=null) 
      editor.destroy(); 
    } 

    function ck_init(ck_inst_name) 
    { 
     var el_id=document.getElementById(ck_inst_name); 
     if(typeof(el_id) != 'undefined' && el_id!=null) 
     { 
      if(typeof(editor) == 'undefined' || editor==null) 
      { 
       editor=CKEDITOR.replace(ck_inst_name); 
      } 
      else 
      { 
       ck_delete(editor); 
       editor=null; 
       editor = CKEDITOR.replace(ck_inst_name); 
      } 
     } 
    } 

También verifico si existe un elemento HTML que debería reemplazarse, así que no aparece un mensaje de error.

+0

Esto resolvió un problema similar (¿el mismo?) Para mí (reemplazando ckeditor basado en el retorno de la llamada AJAX) pero aún obtengo el TypeError no detectado (lo mismo que en el OP). No estoy seguro de si hay algún efecto secundario, pero me gustaría deshacerme del mensaje de error. Mi código para cargar el editor es: window.makeCkEditor = function(e, w, h) { var cki, config, ei; ei = CKEDITOR.instances[e]; if (ei) ei.destroy(true); config = { width: w, height: h }; return cki = CKEDITOR.replace(e, config); }; ¿Alguna idea sobre cómo puedo deshacerme del msg? –

+0

@KenThompson: Tengo un enfoque un poco diferente, pero ¿has intentado destruir el objeto ck antes de la llamada AJAX? –

+0

destroy (true) parece funcionar:) – bjunix

2

Puede aplicar uno de los parches al http://dev.ckeditor.com/ticket/8226 y funcionará. Sugiero este: http://dev.ckeditor.com/attachment/ticket/8226/8226_5.patch

+0

Soy un poco nuevo en la línea de comandos; ¿Cómo aplico este parche? Me estoy ejecutando en Windows 7 x64. –

+0

Puede ser demasiado complejo solo para hacer eso. La forma en que trabajo es tener una copia SVN, es fácil con TortoiseSVN, luego usando el menú contextual en la carpeta usa la opción Patch y luego tienes que volver a empaquetar todo el código CKEditor (por lo que también necesitas tener Java instalado). Es una lástima que se requiera que haga todos esos pasos solo porque no les gustó el parche y propuso algo más complejo que al final no se ha agregado. – AlfonsoML

+0

Bueno, dado que no estoy usando SVN, revisé el archivo 'patch' e hice todos esos cambios manualmente. Ahora, todos esos cambios estaban bajo la carpeta '_source'. Supongo que 'ckeditor.js' de alguna manera se compila/concatena/comprime desde todos esos archivos. ¿Cómo voy a hacer eso? –

1

Tuvimos este problema al integrar CKEDITOR en GWT, en un cuadro de diálogo emergente. Cuando se destruyó el diálogo, CKEDITOR planteó este error: "No se puede leer la propiedad 'documento' de nulo". La solución fue destruir CKEDITOR antes de cerrar el diálogo. (Tuvimos que ampliar la clase GWT ckeditor para anular esto - usando la sintaxis editor.destroy (true) dada por Erik - ¡Gracias, Erik!)

+1

No hay problema, me alegro de poder ayudar –

Cuestiones relacionadas