J'utilise des dialogues jquery pour présenter des formulaires (récupérés via AJAX). Sur certains formulaires, j'utilise un CKEditor pour les zones de texte. L'éditeur affiche bien sur le premier chargement.
Lorsque l'utilisateur annule la boîte de dialogue, je supprime le contenu afin qu'il soit chargé à nouveau lors d'une demande ultérieure. Le problème est qu'une fois la boîte de dialogue rechargée, le CKEditor affirme que 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 existants, et j'ai vu des gens affirmer qu'il s'agissait d'une solution:
if (CKEDITOR.instances['textarea_name']) {
CKEDITOR.instances['textarea_name'].destroy();
}
CKEDITOR.replace('textarea_name');
Cela ne fonctionne pas pour moi, car je reçois une nouvelle erreur à la place:
TypeError: Result of expression 'i.contentWindow' [null] is not an object.
Cette erreur semble se produire sur le "destroy ()" plutôt que le "replace ()". Quelqu'un a-t-il vécu cela et trouvé une solution différente?
Est-il possible de «re-rendre» l'éditeur existant, plutôt que de le détruire et de le remplacer?
MISE À JOUR Voici une autre question traitant du même problème, mais il a fourni un cas de test téléchargeable .
la source
la source
J'ai eu ce problème aussi, mais je l'ai résolu d'une manière beaucoup plus simple ...
J'utilisais la classe "ckeditor" dans mon script jQuery comme sélecteur pour les zones de texte que je voulais utiliser pour CKEditor. Le script JS par défaut de ckeditor utilise également cette classe pour identifier les zones de texte à utiliser pour CKEditor.
Cela signifiait qu'il y avait un conflit entre mon script jQuery et le script ckeditor par défaut.
J'ai simplement changé la classe du textarea et mon script jQuery en 'do_ckeditor' (vous pouvez utiliser n'importe quoi sauf "ckeditor") et cela a fonctionné.
la source
C'est la solution la plus simple (et la seule) qui a fonctionné pour moi:
La suppression de cette entrée dans le tableau empêche ce contrôle de sécurité du formulaire de détruire votre application.
destroy () et remove () ne fonctionnaient pas pour moi.
la source
delete
ni aucundestroy()
nettoyage complet de l'instance de l'éditeur. Des choses comme le dictionnaire et d'autres objets associés se cacheront toujours.Cela vous aidera peut-être - j'ai fait quelque chose de similaire en utilisant jquery, sauf que je charge un nombre inconnu d'objets ckeditor. Il m'a fallu un certain temps pour tomber dessus - ce n'est pas clair dans la documentation.
Et voici ce que je lance pour obtenir le contenu des éditeurs:
MISE À JOUR : J'ai changé ma réponse pour utiliser la bonne méthode - qui est .destroy (). .remove () est censé être interne et a été mal documenté à un moment donné.
la source
J'ai eu un problème similaire où nous faisions plusieurs instances de CKeditor pour le contenu chargé via ajax.
Gardé le DOM dans la mémoire et n'a pas supprimé toutes les liaisons.
A donné l'erreur i.contentWindow chaque fois que je crée une nouvelle instance avec de nouvelles données d'ajax. Mais ce n'était que jusqu'à ce que je comprenne que je détruisais l'instance après avoir effacé le DOM.
Utilisez destroy () pendant que l'instance et son DOM sont présents sur la page, cela fonctionne parfaitement bien.
la source
Pour les demandes ajax,
cet extrait supprime toutes les instances du document. Crée ensuite de nouvelles instances.
la source
la source
le
i.contentWindow is null
erreur semble se produire lors de l'appel de destroy sur une instance d'éditeur liée à une zone de texte qui n'est plus dans le DOM.CKEDITORY.destroy
prend un paramètrenoUpdate
.L'APIdoc déclare:
Donc, pour éviter l'erreur, appelez destroy avant de supprimer l'élément textarea du DOM, ou appelez destory (true) pour éviter d'essayer de mettre à jour l'élément DOM inexistant.
(en utilisant la version 3.6.2 avec l'adaptateur jQuery)
la source
C'est ce qui a fonctionné pour moi:
la source
J'utilise ceci avant mes appels pour créer une instance (un par chargement de page). Je ne sais pas comment cela affecte la gestion de la mémoire ou non. Cela ne fonctionnerait que si vous vouliez remplacer toutes les instances d'une page.
la source
J'ai préparé ma propre solution basée sur tous les codes ci-dessus.
Cela fonctionne parfaitement pour moi.
Parfois, après une requête AJAX, la structure DOM est incorrecte. Pour instace:
Cela causera également des problèmes et ckEditor ne fonctionnera pas. Assurez-vous donc que vous avez une structure DOM correcte.
la source
J'ai eu le même problème avec les instances, je cherchais partout et finalement cette implémentation fonctionne pour moi:
la source
Vous pouvez supprimer n'importe quelle instance de ckeditor par la méthode remove de ckeditor. L'instance sera l'identifiant ou le nom de la zone de texte.
la source
En effet, supprimer la classe ".ckeditor" de votre code résout le problème. La plupart d'entre nous ont suivi l'exemple d'intégration jQuery de la documentation de ckeditor:
et j'ai pensé "... peut-être que je peux simplement me débarrasser de la partie '.jquery_'".
J'ai perdu mon temps à peaufiner la fonction de rappel (parce que le {skin: 'office2003'} fonctionnait réellement), alors que le problème venait d'ailleurs.
Je pense que la documentation devrait mentionner que l'utilisation de "ckeditor" comme nom de classe n'est pas recommandée, car c'est un mot-clé réservé.
À votre santé.
la source
J'ai appris ça
supprimer CKEDITOR.instances [nom de l'éditeur];
par lui-même, a effectivement supprimé l'instance. TOUTES les autres méthodes que j'ai lues et vues, y compris ce qui a été trouvé ici à stackoverflow par ses utilisateurs, n'ont pas fonctionné pour moi.
Dans ma situation, j'utilise un appel ajax pour extraire une copie du contenu enroulé autour des et. Le problème se trouve être parce que j'utilise un événement jQuery .live pour lier un lien «Modifier ce document», puis j'applique l'instance de ckeditor après le succès du chargement ajax. Cela signifie que lorsque je clique sur un autre lien un lien avec un autre événement .live, je dois utiliser la suppression CKEDITOR.instances [nom_éditeur] dans le cadre de ma tâche d'effacer la fenêtre de contenu (contenant le formulaire), puis de récupérer le contenu détenu dans la base de données ou dans une autre ressource.
la source
J'ai le même problème avec une boîte de dialogue jQuery.
Pourquoi détruire l'instance si vous souhaitez simplement supprimer les données précédentes?
la source
J'ai choisi de renommer toutes les instances au lieu de détruire / remplacer - car parfois l'instance chargée AJAX ne remplace pas vraiment celle au cœur de la page ... garde plus de RAM, mais moins de conflits de cette façon.
la source
Je suis dans la situation où je dois contrôler les dialogues qui engendrent, chacun d'eux doit avoir un ckeditor intégré dans ces dialogues. Et il se trouve que les zones de texte partagent le même identifiant. (Normalement, c'est une très mauvaise pratique, mais j'ai 2 jqGrids, un des éléments affectés et un autre des éléments non affectés.) Ils partagent une configuration presque identique. Ainsi, j'utilise un code commun pour configurer les deux.
Ainsi, lorsque je charge une boîte de dialogue, pour ajouter des lignes ou pour les éditer, à partir de jqGrid; Je dois supprimer toutes les instances de CKEDITOR dans toutes les zones de texte.
Cela bouclera sur toutes les zones de texte, et s'il y a une instance de CKEDITOR, la détruira.
Sinon, si vous utilisez jQuery pur:
la source
remove
class="ckeditor"
, cela pourrait avoir déclenché l'initialisation de ckeditorla source
J'ai eu le même problème où je recevais une exception de référence nulle et le mot «null» serait affiché dans l'éditeur. J'ai essayé une poignée de solutions, y compris la mise à niveau de l'éditeur vers la version 3.4.1 en vain.
J'ai fini par devoir éditer la source. Aux environs des lignes 416 à 426 dans _source \ plugins \ wysiwygarea \ plugin.js, il y a un extrait comme celui-ci:
Dans FF au moins, l'iframe n'est pas complètement instanciée au moment où elle est nécessaire. J'ai entouré le reste de la fonction après cette ligne avec une fonction setTimeout:
Le texte est rendu cohérent maintenant dans les boîtes de dialogue modales.
la source
Pour prendre en charge le chargement dynamique (Ajax) des formulaires (sans actualisation de la page entre) qui contiennent des zones de texte avec le même (le même formulaire est appelé à nouveau) ou des ID différents (formulaire précédemment déchargé) et les convertir en éléments CKEditor, j'ai fait ce qui suit (en utilisant le JQuery adaptateur):
Une fois que la page a terminé chaque appel Ajax qui délivre une zone de texte à convertir, j'appelle la fonction suivante:
Cela ressemble à ceci (cela suppose que vos zones de texte soient converties en RTE's have class = "yourCKClass" ):
Je dois mentionner que la ligne:
pourrait (et devrait) être simplement:
cependant j'ai trouvé que l'éditeur montrait souvent le contenu correct pendant une seconde après le chargement et les vidait de l'éditeur du contenu souhaité. Ainsi, cette ligne avec le code de rappel force le contenu de CKEditor à être le même que le contenu textarea d'origine. Provoque un scintillement lorsqu'il est utilisé. Si vous pouvez éviter de l'utiliser, faites-le.
la source
J'ai eu exactement le même problème que jackboberg. J'utilisais le chargement de formulaire dynamique dans les boîtes de dialogue jquery, puis j'attachais divers widgets (datepickers, ckeditors, etc.). Et j'ai essayé toutes les solutions mentionnées ci-dessus, aucune d'elles n'a fonctionné pour moi.
Pour une raison quelconque, ckeditor n'a joint que la première fois que j'ai chargé le formulaire, la deuxième fois que j'ai eu exactement le même message d'erreur que jackboberg.
J'ai analysé mon code et découvert que si vous attachez ckeditor "en l'air" alors que le contenu du formulaire n'est toujours pas placé dans la boîte de dialogue, ckeditor n'attachera pas correctement ses liaisons. C'est parce que ckeditor est attaché en "mid-air", la deuxième fois que vous le connectez en "mid-air" ... pouf ... une erreur est émise car la première instance n'a pas été correctement supprimée du DOM.
C'était mon code qui a produit l'erreur:
C'est le correctif qui a fonctionné:
la source
J'ai rencontré exactement la même chose et le problème était que le plugin wordcount prenait trop de temps à s'initialiser. 30+ secondes. L'utilisateur cliquait dans la vue affichant le ckeditor, puis annulait, chargeant ainsi ajax une nouvelle page dans le dom. Le plugin se plaignait parce que l'iframe ou tout ce que contentWindow pointe n'était plus visible au moment où il était prêt à s'ajouter à contentWindow. Vous pouvez le vérifier en cliquant dans votre vue, puis en attendant que le nombre de mots apparaisse en bas à droite de l'éditeur. Si vous annulez maintenant, vous n'aurez pas de problème. Si vous ne l'attendez pas, vous obtiendrez l'erreur i.contentWindow is null. Pour résoudre ce problème, supprimez simplement le plugin:
Si vous avez besoin d'un compteur de mots, enregistrez-vous pour les événements de collage et de saisie sur l'éditeur avec une fonction qui compte les mots.
la source
Pour ceux qui utilisent l '"adaptateur" jquery et qui ont des problèmes (comme je l'étais), comme solution super hackish mais efficace est de faire quelque chose comme ceci:
Le point clé étant cette partie:
Cela résout le problème avec le texte de l'éditeur qui n'est pas visible la prochaine fois que vous ouvrez la boîte de dialogue. Je me rends compte que c'est très hackish, mais étant donné que la plupart d'entre eux seront utilisés pour les outils d'administration, je ne pense pas que ce soit un problème aussi grave que d'habitude ... et cela fonctionne, alors j'espère que cela sauvera quelqu'un temps ;)
la source
Ceci est le code entièrement fonctionnel pour jquery .load () api et ckeditor, dans mon cas, je charge une page avec ckeditor en div avec quelques effets jquery. J'espère que cela vous aidera.
la source
C'est assez simple. Dans mon cas, j'ai exécuté la méthode jquery ci-dessous qui détruira les instances de ckeditor lors d'un chargement de page. Cela a fait l'affaire et a résolu le problème -
Méthode JQuery -
C'est tout. J'espère que ça t'aide.
Salut, Sirish.
la source
Cette fonction fonctionne pour moi dans CKEditor version 4.4.5, il n'y a pas de fuite de mémoire
// appelle cette fonction comme ci-dessous
la source
CKeditor 4.2.1
Il y a beaucoup de réponses ici mais pour moi j'avais besoin de quelque chose de plus (un peu sale aussi, donc si quelqu'un peut s'améliorer, faites-le). Pour moi, les MODALs où mon problème.
Je rendais le CKEditor dans un modal, en utilisant Foundation. Idéalement, j'aurais détruit l'éditeur à la fermeture, mais je ne voulais pas jouer avec Foundation.
J'ai appelé delete, j'ai essayé de supprimer et une autre méthode, mais c'est ce que j'ai finalement choisi.
J'utilisais des textarea pour ne pas peupler des DIV.
Ma solution
c'était ma méthode pour renvoyer ma mise en forme spécifique, dont vous ne voudrez peut-être pas.
la source
Essaye ça:
la source