Estoy usando diálogos de jquery para presentar formularios (obtenidos a través de AJAX). En algunos formularios, estoy usando un CKEditor para las áreas de texto. El editor se muestra bien en la primera carga.
Cuando el usuario cancela el cuadro de diálogo, elimino el contenido para que se carguen nuevos en una solicitud posterior. El problema es que, una vez que se vuelve a cargar el cuadro de diálogo, CKEditor afirma que el editor ya existe.
uncaught exception: [CKEDITOR.editor] The instance "textarea_name" already exists.
La API incluye un método para destruir editores existentes, y he visto personas que afirman que esta es una solución:
if (CKEDITOR.instances['textarea_name']) {
CKEDITOR.instances['textarea_name'].destroy();
}
CKEDITOR.replace('textarea_name');
Esto no me funciona, ya que recibo un nuevo error:
TypeError: Result of expression 'i.contentWindow' [null] is not an object.
Este error parece ocurrir en "destroy ()" en lugar de "replace ()". ¿Alguien ha experimentado esto y ha encontrado una solución diferente?
¿Es posible 'volver a renderizar' el editor existente, en lugar de destruirlo y reemplazarlo?
ACTUALIZADO Aquí hay otra pregunta que trata con el mismo problema, pero ha proporcionado un caso de prueba descargable .
fuente
fuente
También tuve este problema, pero lo resolví de una manera mucho más simple ...
Estaba usando la clase "ckeditor" en mi script jQuery como selector para las áreas de texto que quería usar para CKEditor. El script JS de ckeditor predeterminado también usa esta clase para identificar qué áreas de texto usar para CKEditor.
Esto significa que hay un conflicto entre mi script jQuery y el script ckeditor predeterminado.
Simplemente cambié la clase del área de texto y mi script jQuery a 'do_ckeditor' (se puede usar cualquier cosa excepto "ckeditor") y funcionó.
fuente
Esta es la solución más simple (y única) que funcionó para mí:
Eliminar esta entrada en la matriz evita que esta verificación de seguridad del formulario destruya su aplicación.
destruir () y eliminar () no funcionó para mí.
fuente
delete
odestroy()
totalmente limpia la instancia del editor. Cosas como el diccionario y otros objetos asociados todavía estarán al acecho.Quizás esto te ayude: he hecho algo similar usando jquery, excepto que estoy cargando un número desconocido de objetos ckeditor. Me tomó un tiempo tropezar con esto, no está claro en la documentación.
Y esto es lo que ejecuto para obtener el contenido de los editores:
ACTUALIZACIÓN : Cambié mi respuesta para usar el método correcto, que es .destroy (). .remove () está destinado a ser interno y se documentó incorrectamente en un momento.
fuente
Tuve un problema similar en el que estábamos creando varias instancias de CKeditor para el contenido cargado a través de ajax.
Mantuvo el DOM en la memoria y no eliminó todos los enlaces.
Dio el error de error i.contentWindow cada vez que creo una nueva instancia con nuevos datos de ajax. Pero esto fue solo hasta que descubrí que estaba destruyendo la instancia después de borrar el DOM.
Use destroy () mientras la instancia y su DOM están presentes en la página, entonces funciona perfectamente bien.
fuente
Para solicitudes de ajax,
esto recortado elimina todas las instancias del documento. Luego crea nuevas instancias.
fuente
fuente
El
i.contentWindow is null
error parece ocurrir al llamar a destroy en una instancia de editor que estaba vinculada a un área de texto que ya no está en el DOM.CKEDITORY.destroy
toma un parámetronoUpdate
.El APIdoc dice:
Entonces, para evitar el error, llame a destroy antes de eliminar el elemento textarea del DOM, o llame a destory (true) para evitar intentar actualizar el elemento DOM que no existe.
(usando la versión 3.6.2 con el adaptador jQuery)
fuente
Esto es lo que funcionó para mí:
fuente
Estoy usando esto antes de mis llamadas para crear una instancia (por carga de página). No estoy seguro de cómo esto afecta el manejo de la memoria y qué no. Esto solo funcionaría si quisiera reemplazar todas las instancias en una página.
fuente
He preparado mi propia solución basada en todos los códigos anteriores.
Funciona perfectamente para mí.
A veces, después de la solicitud AJAX, hay una estructura DOM incorrecta. Por ejemplo:
Esto también causará problemas y ckEditor no funcionará. Así que asegúrese de tener la estructura DOM correcta.
fuente
Tuve el mismo problema con las instancias, estaba buscando en todas partes y finalmente esta implementación funciona para mí:
fuente
Puede eliminar cualquier instancia de ckeditor mediante el método de eliminación de ckeditor. La instancia será id o nombre del área de texto.
fuente
De hecho, eliminar la clase ".ckeditor" de su código resuelve el problema. La mayoría de nosotros seguimos el ejemplo de integración de jQuery de la documentación del ckeditor:
y pensé "... tal vez pueda deshacerme de la parte '.jquery_'".
He estado perdiendo el tiempo ajustando la función de devolución de llamada (porque el {skin: 'office2003'} realmente funcionó), mientras que el problema venía de otra parte.
Creo que la documentación debería mencionar que no se recomienda el uso de "ckeditor" como nombre de clase, porque es una palabra clave reservada.
Salud.
fuente
aprendí eso
eliminar CKEDITOR.instances [editorName];
por sí mismo, en realidad eliminó la instancia. TODOS los demás métodos que he leído y visto, incluido lo que se encontró aquí en stackoverflow de sus usuarios, no funcionaron para mí.
En mi situación, estoy usando una llamada ajax para extraer una copia del contenido envuelto alrededor de y. El problema se debe a que estoy usando un evento jQuery .live para vincular un enlace "Editar este documento" y luego aplicar la instancia de ckeditor después del éxito de la carga de ajax. Esto significa que cuando hago clic en otro enlace, un enlace con otro evento .live, debo usar eliminar CKEDITOR.instances [editorName] como parte de mi tarea de borrar la ventana de contenido (sosteniendo el formulario) y luego recuperar el contenido retenido. en la base de datos u otro recurso.
fuente
Tuve el mismo problema con un jQuery Dialog.
¿Por qué destruir la instancia si solo desea eliminar datos anteriores?
fuente
Elegí cambiar el nombre de todas las instancias en lugar de destruir / reemplazar, ya que a veces la instancia cargada con AJAX no reemplaza realmente a la que está en el núcleo de la página ... mantiene más en RAM, pero menos conflictos de esta manera.
fuente
Estoy en la situación en la que tengo que controlar los cuadros de diálogo que generan, cada uno de ellos debe tener un ckeditor incrustado dentro de estos cuadros de diálogo. Y da la casualidad de que las áreas de texto comparten la misma identificación. (normalmente esto es una práctica muy mala, pero tengo 2 jqGrids, uno de elementos asignados y otro de elementos no asignados). Comparten una configuración casi idéntica. Por lo tanto, estoy usando un código común para configurar ambos.
Entonces, cuando cargo un diálogo, para agregar filas o para editarlas, desde jqGrid; Debo eliminar todas las instancias de CKEDITOR en todas las áreas de texto.
Esto recorrerá todas las áreas de texto y, si hay una instancia de CKEDITOR, la destruirá.
Alternativamente, si usa jQuery puro:
fuente
eliminar
class="ckeditor"
, podría haber activado la inicialización de ckeditorfuente
Tuve el mismo problema en el que recibía una excepción de referencia nula y la palabra "nulo" se mostraba en el editor. Probé un puñado de soluciones, incluida la actualización del editor a 3.4.1 en vano.
Terminé teniendo que editar la fuente. Aproximadamente en la línea 416 a 426 en _source \ plugins \ wysiwygarea \ plugin.js, hay un fragmento como este:
En FF al menos, el iframe no está completamente instanciado en el momento en que se necesita. Rodeé el resto de la función después de esa línea con una función setTimeout:
El texto se representa ahora de forma coherente en los diálogos modales.
fuente
Para admitir la carga dinámica (Ajax) de formularios (sin actualizaciones de página entre ellos) que contienen áreas de texto con el mismo (se vuelve a llamar al mismo formulario) o ID diferentes (formulario descargado previamente) y convertirlos en elementos CKEditor, hice lo siguiente (usando JQuery adaptador):
Una vez que la página ha finalizado cada llamada Ajax que entrega un área de texto para convertir, hago una llamada a la siguiente función:
Esto se ve así (asume que sus áreas de texto que se convertirán a RTE tienen class = "yourCKClass" ):
Debo mencionar que la línea:
podría (y debería) ser simplemente:
sin embargo, descubrí que el editor a menudo mostraba el contenido correcto durante un segundo después de la carga y vacía el editor del contenido deseado. Entonces, esa línea con el código de devolución de llamada obliga al contenido de CKEditor a ser el mismo que el contenido del área de texto de origen. Provoca un parpadeo cuando se usa. Si puede evitar su uso, hágalo ..
fuente
Tuve exactamente el mismo problema que Jackboberg. Estaba usando la carga de formularios dinámicos en los diálogos de jquery y luego adjuntaba varios widgets (datepickers, ckeditors, etc.). Y probé todas las soluciones mencionadas anteriormente, ninguna de ellas funcionó para mí.
Por alguna razón, ckeditor solo adjuntó la primera vez que cargué el formulario, la segunda vez recibí exactamente el mismo mensaje de error que recibió Jackboberg.
Analicé mi código y descubrí que si adjunta ckeditor en "el aire", es decir, mientras el contenido del formulario todavía no se coloca en el diálogo, ckeditor no adjuntará correctamente sus enlaces. Esto se debe a que ckeditor está adjunto en "mid-air", la segunda vez que lo adjunta en "mid-air" ... puf ... se produce un error ya que la primera instancia no se eliminó correctamente de DOM.
Este fue mi código que produjo el error:
Esta es la solución que funcionó:
fuente
Me encontré con exactamente lo mismo y el problema era que el complemento de recuento de palabras estaba tardando demasiado en inicializarse. 30+ segundos. El usuario haría clic en la vista que muestra el ckeditor, luego cancelaría, por lo que ajax cargaría una nueva página en el dom. El complemento se quejaba porque el iframe o cualquier elemento al que apuntaba contentWindow ya no estaba visible en el momento en que estaba listo para agregarse a contentWindow. Puede verificar esto haciendo clic en su vista y luego esperando que aparezca el recuento de palabras en la parte inferior derecha del editor. Si cancela ahora, no tendrá ningún problema. Si no lo espera, obtendrá el error i.contentWindow es nulo. Para solucionarlo, simplemente deseche el complemento:
Si necesita un contador de palabras, regístrese para los eventos de pegado y teclado en el editor con una función que cuenta las palabras.
fuente
Para aquellos que usan el "adaptador" de jquery y tienen problemas (como yo), una solución súper pirateada pero funcional es hacer algo como esto:
El punto clave es esta parte:
Esto soluciona el problema de que el texto del editor no sea visible la próxima vez que abra el cuadro de diálogo. Me doy cuenta de que esto es muy engañoso, pero teniendo en cuenta que la mayoría de estos se usarán para herramientas de administración, no creo que sea una preocupación tan grande como lo sería normalmente ... y esto funciona, así que espero que le salve a alguien un poco. hora ;)
fuente
Este es el código completamente funcional para jquery .load () api y ckeditor, en mi caso, estoy cargando una página con ckeditor en div con algunos efectos de jquery. Espero que te ayude.
fuente
Es bastante simple. En mi caso, ejecuté el siguiente método jquery que destruirá las instancias de ckeditor durante la carga de una página. Esto funcionó y resolvió el problema:
Método JQuery -
Eso es. Espero que te ayude.
Saludos, Sirish.
fuente
Esta función me funciona en CKEditor versión 4.4.5, no tiene fugas de memoria
// llamar a esta función como se muestra a continuación
fuente
CKeditor 4.2.1
Hay muchas respuestas aquí, pero para mí necesitaba algo más (un poco sucio también, así que si alguien puede mejorar, hágalo). Para mí MODALs donde mi problema.
Estaba renderizando el CKEditor en un modal, usando Foundation. Idealmente, hubiera destituido al editor al cerrar, sin embargo, no quería meterme con Foundation.
Llamé a eliminar, intenté eliminar y otro método, pero esto fue con lo que finalmente me conformé.
Estaba usando textarea's para poblar no DIVs.
Mi solución
este fue mi método para devolver mi formato específico, que es posible que no desee.
fuente
Prueba esto:
fuente