Ich verwende jquery-Dialoge, um Formulare zu präsentieren (abgerufen über AJAX). Auf einigen Formularen verwende ich einen CKEditor für die Textbereiche. Der Editor wird beim ersten Laden einwandfrei angezeigt.
Wenn der Benutzer den Dialog abbricht, entferne ich den Inhalt, damit er bei einer späteren Anforderung frisch geladen wird. Das Problem ist, dass der CKEditor nach dem erneuten Laden des Dialogfelds behauptet, der Editor sei bereits vorhanden.
uncaught exception: [CKEDITOR.editor] The instance "textarea_name" already exists.
Die API enthält eine Methode zum Zerstören vorhandener Editoren, und ich habe Leute gesehen, die behaupteten, dies sei eine Lösung:
if (CKEDITOR.instances['textarea_name']) {
CKEDITOR.instances['textarea_name'].destroy();
}
CKEDITOR.replace('textarea_name');
Dies funktioniert bei mir nicht, da ich stattdessen einen neuen Fehler erhalte:
TypeError: Result of expression 'i.contentWindow' [null] is not an object.
Dieser Fehler scheint eher bei "destroy ()" als bei "replace ()" aufzutreten. Hat jemand dies erlebt und eine andere Lösung gefunden?
Ist es möglich, den vorhandenen Editor neu zu rendern, anstatt ihn zu zerstören und zu ersetzen?
AKTUALISIERT Hier ist eine weitere Frage, die sich mit demselben Problem befasst, aber er hat einen Testfall zum Herunterladen bereitgestellt .
quelle
quelle
Ich hatte dieses Problem auch, aber ich habe es viel einfacher gelöst ...
Ich habe die Klasse "ckeditor" in meinem jQuery-Skript als Selektor für die Textbereiche verwendet, die ich für CKEditor verwenden wollte. Das Standard-JS-Skript ckeditor verwendet diese Klasse auch, um zu identifizieren, welche Textbereiche für CKEditor verwendet werden sollen.
Dies bedeutet, dass ein Konflikt zwischen meinem jQuery-Skript und dem Standard-ckeditor-Skript besteht.
Ich habe einfach die Klasse des Textbereichs und mein jQuery-Skript in 'do_ckeditor' geändert (Sie können alles außer "ckeditor" verwenden) und es hat funktioniert.
quelle
Dies ist die einfachste (und einzige) Lösung, die für mich funktioniert hat:
Durch Löschen dieses Eintrags im Array wird verhindert, dass diese Formularsicherheitsprüfung Ihre Anwendung zerstört.
destroy () und remove () hat bei mir nicht funktioniert.
quelle
delete
nochdestroy()
vollständig bereinigt. Dinge wie das Wörterbuch und andere zugehörige Objekte lauern immer noch herum.Vielleicht hilft Ihnen das weiter - ich habe mit jquery etwas Ähnliches gemacht, außer dass ich eine unbekannte Anzahl von ckeditor-Objekten lade. Es hat eine Weile gedauert, bis ich darauf gestoßen bin - das ist in der Dokumentation nicht klar.
Und hier ist, was ich laufen lasse, um den Inhalt von den Redakteuren zu erhalten:
UPDATE : Ich habe meine Antwort geändert, um die richtige Methode zu verwenden - nämlich .destroy (). .remove () soll intern sein und wurde an einer Stelle nicht ordnungsgemäß dokumentiert.
quelle
Ich hatte ein ähnliches Problem, bei dem wir mehrere Instanzen von CKeditor für den über Ajax geladenen Inhalt erstellt haben.
Hielt das DOM im Speicher und entfernte nicht alle Bindungen.
Hat den Fehler i.contentWindow angezeigt , wenn ich eine neue Instanz mit neuen Daten von Ajax erstelle. Dies war jedoch nur so lange, bis ich herausfand, dass ich die Instanz nach dem Löschen des DOM zerstörte.
Verwenden Sie destroy (), während die Instanz und das DOM auf der Seite vorhanden sind. Dann funktioniert es einwandfrei.
quelle
Für Ajax-Anfragen,
Durch diesen Ausschnitt werden alle Instanzen aus dem Dokument entfernt. Dann werden neue Instanzen erstellt.
quelle
quelle
Der
i.contentWindow is null
Fehler scheint beim Aufrufen von destroy für eine Editorinstanz aufzutreten, die an einen Textbereich gebunden war, der sich nicht mehr im DOM befindet.CKEDITORY.destroy
nimmt einen ParameternoUpdate
.Der APIdoc gibt an:
Um den Fehler zu vermeiden, rufen Sie entweder destroy auf, bevor Sie das Textarea-Element aus dem DOM entfernen, oder rufen Sie destory (true) auf, um zu vermeiden, dass versucht wird, das nicht vorhandene DOM-Element zu aktualisieren.
(unter Verwendung von Version 3.6.2 mit jQuery-Adapter)
quelle
Das hat bei mir funktioniert:
quelle
Ich verwende dies vor meinen Aufrufen, um eine Instanz zu erstellen (eine pro Seite laden). Ich bin mir nicht sicher, wie sich dies auf die Speicherbehandlung auswirkt und was nicht. Dies würde nur funktionieren, wenn Sie alle Instanzen auf einer Seite ersetzen möchten.
quelle
Ich habe meine eigene Lösung basierend auf allen oben genannten Codes vorbereitet.
Es funktioniert perfekt für mich.
Manchmal liegt nach einer AJAX-Anforderung eine falsche DOM-Struktur vor. Zum Beispiel:
Dies führt ebenfalls zu Problemen und ckEditor funktioniert nicht. Stellen Sie also sicher, dass Sie die richtige DOM-Struktur haben.
quelle
Ich hatte das gleiche Problem mit Instanzen, ich habe überall gesucht und schließlich funktioniert diese Implementierung für mich:
quelle
Sie können jede ckeditor-Instanz entfernen, indem Sie die Methode ckeditor entfernen. Die Instanz ist die ID oder der Name des Textbereichs.
quelle
In der Tat löst das Entfernen der Klasse ".ckeditor" aus Ihrem Code das Problem. Die meisten von uns folgten dem Integrationsbeispiel für jQuery aus der Dokumentation des ckeditors:
und dachte "... vielleicht kann ich einfach loswerden oder den '.jquery_'-Teil".
Ich habe meine Zeit damit verschwendet, die Rückruffunktion zu optimieren (weil {skin: 'office2003'} tatsächlich funktioniert hat), während das Problem von einem anderen Ort kam.
Ich denke, in der Dokumentation sollte erwähnt werden, dass die Verwendung von "ckeditor" als Klassenname nicht empfohlen wird, da es sich um ein reserviertes Schlüsselwort handelt.
Prost.
quelle
Ich habe das gelernt
lösche CKEDITOR.instances [editorName];
von sich aus tatsächlich die Instanz entfernt. Alle anderen Methoden, die ich gelesen und gesehen habe, einschließlich der hier bei stackoverflow von seinen Benutzern gefundenen, haben bei mir nicht funktioniert.
In meiner Situation verwende ich einen Ajax-Aufruf, um eine Kopie des Inhalts abzurufen, der um die und 's gewickelt ist. Das Problem liegt zufällig darin, dass ich ein jQuery .live-Ereignis verwende, um einen Link "Dieses Dokument bearbeiten" zu binden und dann die ckeditor-Instanz nach erfolgreichem Laden von Ajax anzuwenden. Dies bedeutet, dass ich, wenn ich auf einen anderen Link klicke, einen Link mit einem anderen .live-Ereignis, die Datei CKEDITOR.instances [editorName] löschen als Teil meiner Aufgabe verwenden muss, das Inhaltsfenster zu löschen (das Formular zu halten) und dann den gehaltenen Inhalt erneut abzurufen in der Datenbank oder einer anderen Ressource.
quelle
Ich hatte das gleiche Problem mit einem jQuery-Dialog.
Warum die Instanz zerstören, wenn Sie nur vorherige Daten entfernen möchten?
quelle
Ich habe mich dafür entschieden, alle Instanzen umzubenennen, anstatt sie zu zerstören / zu ersetzen - da die von AJAX geladene Instanz manchmal die Instanz im Kern der Seite nicht wirklich ersetzt ... hält mehr im RAM, aber weniger Konflikte auf diese Weise.
quelle
Ich bin in der Situation, in der ich steuern muss, dass Dialoge erzeugt werden. In jedem von ihnen muss ein ckeditor in diese Dialoge eingebettet sein. Und es passiert einfach so, dass die Textbereiche dieselbe ID haben. (Normalerweise ist dies eine sehr schlechte Praxis, aber ich habe 2 jqGrids, eines von zugewiesenen Elementen und eines von nicht zugewiesenen Elementen.) Sie haben eine fast identische Konfiguration. Daher verwende ich gemeinsamen Code, um beide zu konfigurieren.
Wenn ich also einen Dialog lade, um Zeilen hinzuzufügen oder zu bearbeiten, entweder aus jqGrid; Ich muss alle Instanzen von CKEDITOR in allen Textbereichen entfernen.
Dadurch werden alle Textbereiche durchlaufen. Wenn eine CKEDITOR-Instanz vorhanden ist, zerstören Sie diese.
Alternativ, wenn Sie reine jQuery verwenden:
quelle
entfernen
class="ckeditor"
, es könnte ckeditor Initialisierung ausgelöst habenquelle
Ich hatte das gleiche Problem, bei dem ich eine Nullreferenzausnahme erhielt und das Wort "null" im Editor angezeigt wurde. Ich habe eine Handvoll Lösungen ausprobiert, darunter das vergebliche Upgrade des Editors auf 3.4.1.
Am Ende musste ich die Quelle bearbeiten. Ungefähr in den Zeilen 416 bis 426 in _source \ plugins \ wysiwygarea \ plugin.js befindet sich ein Snippet wie das folgende:
Zumindest in FF wird der Iframe nicht vollständig instanziiert, wenn er benötigt wird. Ich habe den Rest der Funktion nach dieser Zeile mit einer setTimeout-Funktion umgeben:
Der Text wird jetzt in den modalen Dialogen konsistent gerendert.
quelle
Um das dynamische (Ajax) Laden von Formularen (ohne Seitenaktualisierungen dazwischen) zu unterstützen, die Textbereiche mit derselben (dasselbe Formular wird erneut aufgerufen) oder unterschiedlichen IDs (zuvor entladenes Formular) enthalten, und diese in CKEditor-Elemente zu konvertieren, habe ich Folgendes ausgeführt (mithilfe von JQuery) Adapter):
Nachdem die Seite jeden Ajax-Aufruf beendet hat, der einen zu konvertierenden Textbereich liefert, rufe ich die folgende Funktion auf:
Dies sieht folgendermaßen aus (es wird davon ausgegangen, dass Ihre Textbereiche in RTEs konvertiert werden, haben class = "yourCKClass" ):
Ich sollte erwähnen, dass die Zeile:
könnte (und sollte) einfach sein:
Ich stellte jedoch fest, dass der Editor nach dem Laden häufig für eine Sekunde den richtigen Inhalt anzeigt und der Editor den gewünschten Inhalt leert. Diese Zeile mit dem Rückrufcode erzwingt also, dass der CKEditor-Inhalt mit dem ursprünglichen Textbereichsinhalt übereinstimmt. Verursacht bei Verwendung ein Flimmern. Wenn Sie es vermeiden können, tun Sie dies.
quelle
Ich hatte genau das gleiche Problem wie Jackboberg. Ich habe das dynamische Laden von Formularen in jquery-Dialoge verwendet und dann verschiedene Widgets (Datepicker, ckeditors usw.) angehängt. Und ich habe alle oben genannten Lösungen ausprobiert, keine davon hat für mich funktioniert.
Aus irgendeinem Grund hat ckeditor nur beim ersten Laden des Formulars angehängt, beim zweiten Mal habe ich genau die gleiche Fehlermeldung erhalten, die jackboberg erhalten hat.
Ich habe meinen Code analysiert und festgestellt, dass ckeditor seine Bindungen nicht ordnungsgemäß anfügt, wenn Sie ckeditor in "mid-air" anhängen, während der Formularinhalt noch nicht in den Dialog gestellt wird. Das heißt, da ckeditor in "mid-air" angehängt ist, wird beim zweiten Anschließen in "mid-air" ... poof ... ein Fehler ausgegeben, da die erste Instanz nicht ordnungsgemäß aus DOM entfernt wurde.
Dies war mein Code, der den Fehler verursachte:
Dies ist das Update, das funktioniert hat:
quelle
Ich bin genau auf dasselbe gestoßen und das Problem war, dass die Initialisierung des Wordcount-Plugins zu lange dauerte. 30+ Sekunden. Der Benutzer klickt in die Ansicht, in der der ckeditor angezeigt wird, und bricht dann ab, wodurch eine neue Seite in den Dom geladen wird. Das Plugin hat sich beschwert, weil der Iframe oder was auch immer contentWindow zeigt, nicht mehr sichtbar war, als es bereit war, sich selbst zum contentWindow hinzuzufügen. Sie können dies überprüfen, indem Sie in Ihre Ansicht klicken und dann darauf warten, dass die Wortanzahl unten rechts im Editor angezeigt wird. Wenn Sie jetzt kündigen, haben Sie kein Problem. Wenn Sie nicht darauf warten, wird der Fehler i.contentWindow null angezeigt. Um das Problem zu beheben, verschrotten Sie einfach das Plugin:
Wenn Sie einen Wortzähler benötigen, registrieren Sie sich für die Einfüge- und Eingabeereignisse im Editor mit einer Funktion, die die Wörter zählt.
quelle
Für diejenigen, die den jquery "Adapter" verwenden und Probleme haben (wie ich), ist es eine super hackige und dennoch funktionierende Lösung, Folgendes zu tun:
Der entscheidende Punkt ist dieser Teil:
Dies behebt das Problem, dass der Editortext beim nächsten Öffnen des Dialogfelds nicht sichtbar ist. Mir ist klar, dass dies sehr hackisch ist, aber wenn man bedenkt, dass die meisten davon für Admin-Tools verwendet werden, denke ich nicht, dass dies ein so großes Problem ist, wie es normalerweise wäre. Und das funktioniert, also wird es hoffentlich jemandem etwas ersparen Zeit ;)
quelle
Dies ist der voll funktionsfähige Code für jquery .load () api und ckeditor. In meinem Fall lade ich eine Seite mit ckeditor in div mit einigen jquery-Effekten. Ich hoffe es hilft dir.
quelle
Es ist ziemlich einfach. In meinem Fall habe ich die folgende jquery-Methode ausgeführt, die ckeditor-Instanzen während des Ladens einer Seite zerstört. Dies hat den Trick getan und das Problem behoben -
JQuery-Methode -
Das ist es. Ich hoffe es hilft dir.
Prost, Sirish.
quelle
Diese Funktion funktioniert bei mir in CKEditor Version 4.4.5, es gibt keine Speicherlecks
// rufe diese Funktion wie folgt auf
quelle
CKeditor 4.2.1
Hier gibt es viele Antworten, aber für mich brauchte ich etwas mehr (auch etwas schmutzig, wenn sich jemand verbessern kann, bitte tun). Für mich waren MODALE mein Problem.
Ich habe den CKEditor mithilfe von Foundation modal gerendert. Im Idealfall hätte ich den Editor beim Schließen zerstört, aber ich wollte mich nicht mit Foundation anlegen.
Ich rief delete an, versuchte es mit remove und einer anderen Methode, aber damit war ich schließlich einverstanden.
Ich habe Textbereiche verwendet, um keine DIVs zu füllen.
Meine Lösung
Dies war meine Methode, um meine spezifische Formatierung zurückzugeben, die Sie möglicherweise nicht möchten.
quelle
Versuche dies:
quelle