Używam okien dialogowych jQuery do prezentowania formularzy (pobieranych przez AJAX). W niektórych formularzach używam CKEditor dla obszarów tekstowych. Edytor wyświetla się dobrze przy pierwszym załadowaniu.
Kiedy użytkownik anuluje okno dialogowe, usuwam zawartość, aby została załadowana na nowo na późniejsze żądanie. Problem polega na tym, że po ponownym załadowaniu okna dialogowego CKEditor twierdzi, że edytor już istnieje.
uncaught exception: [CKEDITOR.editor] The instance "textarea_name" already exists.
API zawiera metodę niszczenia istniejących edytorów i widziałem ludzi twierdzących, że jest to rozwiązanie:
if (CKEDITOR.instances['textarea_name']) {
CKEDITOR.instances['textarea_name'].destroy();
}
CKEDITOR.replace('textarea_name');
U mnie to nie działa, ponieważ zamiast tego pojawia się nowy błąd:
TypeError: Result of expression 'i.contentWindow' [null] is not an object.
Wydaje się, że ten błąd występuje raczej w funkcji „niszcz ()” niż w funkcji „replace ()”. Czy ktoś tego doświadczył i znalazł inne rozwiązanie?
Czy można „ponownie wyrenderować” istniejący edytor zamiast go niszczyć i zastępować?
AKTUALIZACJA Oto kolejne pytanie dotyczące tego samego problemu, ale dostarczył on przypadek testowy do pobrania .
źródło
źródło
Ja też miałem ten problem, ale rozwiązałem go w dużo prostszy sposób ...
Używałem klasy „ckeditor” w moim skrypcie jQuery jako selektora, dla których obszarów tekstowych chciałem użyć CKEditor. Domyślny skrypt JS ckeditor również używa tej klasy do identyfikowania obszarów tekstu, które mają być używane przez CKEditor.
Oznaczało to konflikt między moim skryptem jQuery a domyślnym skryptem ckeditor.
Po prostu zmieniłem klasę obszaru textarea i mojego skryptu jQuery na „do_ckeditor” (można było użyć czegokolwiek poza „ckeditor”) i zadziałało.
źródło
To najprostsze (i jedyne) rozwiązanie, które u mnie zadziałało:
Usunięcie tego wpisu w tablicy zapobiega zniszczeniu aplikacji przez tę kontrolę bezpieczeństwa formularza.
Zniszcz () i usuń () nie działa dla mnie.
źródło
delete
czydestroy()
w pełni oczyścić instancji edytora. Rzeczy takie jak słownik i inne powiązane obiekty nadal będą się czaić.Być może to ci pomoże - zrobiłem coś podobnego za pomocą jquery, z tym że ładuję nieznaną liczbę obiektów ckeditor. Zajęło mi trochę czasu, zanim się na to natknąłem - nie jest to jasne w dokumentacji.
A oto, co uruchamiam, aby uzyskać treść od redaktorów:
AKTUALIZACJA : Zmieniłem odpowiedź, aby użyć poprawnej metody - czyli .destroy (). .remove () ma być wewnętrzną i w pewnym momencie została nieprawidłowo udokumentowana.
źródło
Miałem podobny problem, gdy tworzyliśmy kilka instancji CKeditor dla treści ładowanej przez ajax.
Zachował DOM w pamięci i nie usunął wszystkich powiązań.
Podawałem błąd i.contentWindow błąd za każdym razem, gdy tworzę nową instancję z nowymi danymi z ajax. Ale to było tylko do momentu, gdy zorientowałem się, że niszczę instancję po wyczyszczeniu DOM.
Użyj funkcji niszczenia (), gdy instancja i jej DOM są obecne na stronie, wtedy działa idealnie.
źródło
W przypadku żądań Ajax,
to wycięte usuwa wszystkie instancje z dokumentu. Następnie tworzy nowe instancje.
źródło
źródło
i.contentWindow is null
Błąd wydaje się występować podczas wywoływania zniszczyć na przykład edytor, który był przywiązany do textarea nie jest już w DOM.CKEDITORY.destroy
przyjmuje parametrnoUpdate
.APIdoc stwierdza:
Dlatego, aby uniknąć błędu, wywołaj funkcję niszczenia przed usunięciem elementu textarea z DOM lub wywołaj destory (true), aby uniknąć próby zaktualizowania nieistniejącego elementu DOM.
(przy użyciu wersji 3.6.2 z adapterem jQuery)
źródło
Oto, co zadziałało dla mnie:
źródło
Używam tego przed wywołaniami do utworzenia instancji (jeden na załadowanie strony). Nie wiem, jak to wpływa na obsługę pamięci, a co nie. To zadziała tylko wtedy, gdy chcesz zamienić wszystkie wystąpienia na stronie.
źródło
Przygotowałem własne rozwiązanie w oparciu o wszystkie powyższe kody.
U mnie działa idealnie.
Czasami po żądaniu AJAX pojawia się nieprawidłowa struktura DOM. Na przykład:
Spowoduje to również problem, a ckEditor nie będzie działać. Więc upewnij się, że masz poprawną strukturę DOM.
źródło
miałem ten sam problem z instancjami, szukałem wszędzie i wreszcie ta implementacja u mnie działa:
źródło
Możesz usunąć dowolną instancję ckeditor, usuwając metodę ckeditor. Instancja będzie miała identyfikator lub nazwę obszaru tekstu.
źródło
Rzeczywiście, usunięcie klasy „.ckeditor” z kodu rozwiązuje problem. Większość z nas podążała za przykładem integracji jQuery z dokumentacji ckeditora:
i pomyślałem „... może po prostu mogę się pozbyć lub część '.jquery_'”.
Traciłem czas na poprawianie funkcji wywołania zwrotnego (ponieważ {skin: 'office2003'} faktycznie działał), podczas gdy problem pochodził z innego miejsca.
Myślę, że dokumentacja powinna wspomnieć, że użycie „ckeditor” jako nazwy klasy nie jest zalecane, ponieważ jest to zastrzeżone słowo kluczowe.
Twoje zdrowie.
źródło
Nauczyłem się tego
usuń CKEDITOR.instances [editorName];
sam w sobie, faktycznie usunął instancję. WSZYSTKIE inne metody, które przeczytałem i zobaczyłem, w tym to, co zostało znalezione tutaj w stackoverflow od jego użytkowników, nie działały dla mnie.
W mojej sytuacji używam wywołania Ajax do ściągnięcia kopii zawartości zawiniętej wokół i. Problem polega na tym, że używam zdarzenia jQuery .live, aby powiązać łącze „Edytuj ten dokument”, a następnie po pomyślnym załadowaniu pliku Ajax stosuję instancję ckeditor. Oznacza to, że kiedy kliknę w inny link, odsyłam do innego wydarzenia .live, muszę użyć opcji delete CKEDITOR.instances [editorName] ”w ramach mojego zadania polegającego na wyczyszczeniu okna treści (przytrzymaniu formularza), a następnie ponownym pobraniu zawartości wstrzymanej w bazie danych lub innym zasobie.
źródło
Mam ten sam problem z oknem dialogowym jQuery.
Po co niszczyć instancję, jeśli chcesz tylko usunąć poprzednie dane?
źródło
Zdecydowałem się zmienić nazwy wszystkich instancji zamiast niszczyć / zastępować - ponieważ czasami instancja załadowana AJAX tak naprawdę nie zastępuje instancji w rdzeniu strony ... zachowuje więcej w pamięci RAM, ale w ten sposób mniej konfliktów.
źródło
Jestem w sytuacji, w której muszę kontrolować te okna dialogowe odradzania, każde z nich musi mieć wbudowany ckeditor w tych dialogach. I tak się składa, że obszary tekstowe mają ten sam identyfikator. (Zwykle jest to bardzo zła praktyka, ale mam 2 jqGrids, jeden z przypisanych elementów, a drugi z nieprzypisanych). Mają prawie identyczną konfigurację. Dlatego używam wspólnego kodu do konfigurowania obu.
Tak więc, kiedy ładuję okno dialogowe, aby dodać wiersze lub je edytować, z jqGrid; Muszę usunąć wszystkie wystąpienia CKEDITOR we wszystkich obszarach tekstowych.
Spowoduje to zapętlenie wszystkich obszarów tekstowych, a jeśli istnieje instancja CKEDITOR, zniszczy ją.
Alternatywnie, jeśli używasz czystego jQuery:
źródło
remove
class="ckeditor"
, mógł spowodować inicjalizację ckeditorźródło
Miałem ten sam problem, w którym otrzymywałem wyjątek zerowego odwołania, a słowo „null” było wyświetlane w edytorze. Wypróbowałem kilka rozwiązań, w tym aktualizację edytora do wersji 3.4.1, ale bezskutecznie.
Skończyło się na tym, że musiałem edytować źródło. Mniej więcej w wierszach od 416 do 426 w _source \ plugins \ wysiwygarea \ plugin.js znajduje się taki fragment:
Przynajmniej w FF element iframe nie jest w pełni tworzony do czasu, gdy jest potrzebny. Resztę funkcji po tym wierszu otoczyłem funkcją setTimeout:
Tekst jest teraz konsekwentnie renderowany w modalnych oknach dialogowych.
źródło
Aby obsłużyć dynamiczne (Ajax) ładowanie formularzy (bez odświeżania stron pomiędzy), które zawierają obszary tekstowe z tym samym (ten sam formularz jest wywoływany ponownie) lub różnymi identyfikatorami (poprzednio wyładowany formularz) i przekonwertować je na elementy CKEditor, wykonałem następujące czynności (używając JQuery adapter):
Po zakończeniu każdego wywołania Ajax przez stronę, które dostarcza obszar tekstowy do konwersji, wywołuję następującą funkcję:
Wygląda to tak (zakłada, że obszary tekstowe mają zostać przekonwertowane na RTE mają class = "yourCKClass" ):
Powinienem wspomnieć, że wiersz:
mogłoby (i powinno) być po prostu:
Jednak stwierdziłem, że edytor często wyświetlał poprawną treść przez sekundę po załadowaniu i opróżniał edytor z żądanej treści. Tak więc ta linia z kodem wywołania zwrotnego wymusza, aby zawartość CKEditor była taka sama jak pierwotna zawartość textarea. Po użyciu powoduje migotanie. Jeśli możesz tego uniknąć, zrób to.
źródło
Miałem dokładnie ten sam problem, co jackboberg. Używałem dynamicznego ładowania formularzy do okien dialogowych jquery, a następnie dołączałem różne widżety (datepickers, ckeditors itp.). Wypróbowałem wszystkie wymienione powyżej rozwiązania, żadne z nich nie działało.
Z jakiegoś powodu ckeditor załączył się tylko przy pierwszym ładowaniu formularza, za drugim razem otrzymałem dokładnie ten sam komunikat o błędzie, co jackboberg.
Przeanalizowałem mój kod i odkryłem, że jeśli załączysz ckeditor "w powietrzu", to znaczy gdy treść formularza nadal nie jest umieszczana w oknie dialogowym, ckeditor nie będzie poprawnie dołączał swoich powiązań. Dzieje się tak, ponieważ ckeditor jest podłączony „w powietrzu”, po raz drugi podłączasz go „w powietrzu” ... poof ... pojawia się błąd, ponieważ pierwsza instancja nie została poprawnie usunięta z DOM.
To był mój kod, który spowodował błąd:
Oto poprawka, która zadziałała:
źródło
Natknąłem się dokładnie na to samo i problem polegał na tym, że inicjalizacja wtyczki wordcount trwała zbyt długo. 30+ sekund. Użytkownik kliknąłby widok wyświetlający ckeditor, a następnie anulował, tym samym AJAX ładował nową stronę do domeny. Wtyczka skarżyła się, ponieważ element iframe lub cokolwiek, na co wskazuje contentWindow, nie było już widoczne do czasu, gdy był gotowy do dodania się do contentWindow. Możesz to sprawdzić, klikając swój widok, a następnie czekając, aż liczba słów pojawi się w prawym dolnym rogu edytora. Jeśli anulujesz teraz, nie będziesz mieć problemu. Jeśli nie będziesz na to czekać, pojawi się błąd i.contentWindow jest pusty. Aby to naprawić, po prostu złom wtyczkę:
Jeśli potrzebujesz licznika słów, zarejestruj się na zdarzenia wklejania i wpisywania klucza w edytorze za pomocą funkcji zliczającej słowa.
źródło
Dla tych, którzy używają "adaptera" jquery i mają kłopoty (tak jak ja), ponieważ super hackish, ale działającym rozwiązaniem jest zrobienie czegoś takiego:
Kluczowym punktem jest ta część:
Rozwiązuje to problem polegający na tym, że tekst edytora nie był widoczny przy następnym otwarciu okna dialogowego. Zdaję sobie sprawę, że jest to bardzo hakerskie, ale biorąc pod uwagę, że większość z nich będzie używana jako narzędzia administracyjne, nie sądzę, że jest to tak duży problem, jak zwykle ... i to działa, więc mam nadzieję, że zaoszczędzi to komuś trochę czas;)
źródło
To jest w pełni działający kod dla jquery .load () api i ckeditor, w moim przypadku ładuję stronę z ckeditor do div z pewnymi efektami jquery. Mam nadzieję, że ci to pomoże.
źródło
To całkiem proste. W moim przypadku uruchomiłem poniższą metodę jquery, która niszczy wystąpienia ckeditor podczas ładowania strony. To załatwiło sprawę i rozwiązało problem -
Metoda JQuery -
Otóż to. Mam nadzieję, że Ci to pomoże.
Pozdrawiam, Sirish.
źródło
Ta funkcja działa u mnie w CKEditor w wersji 4.4.5, nie ma żadnych wycieków pamięci
// wywołaj tę funkcję jak poniżej
źródło
CKeditor 4.2.1
Odpowiedzi jest tu wiele, ale potrzebowałem czegoś więcej (też trochę brudnego, więc jeśli ktoś może poprawić, proszę). Dla mnie MODAL, gdzie mój problem.
Renderowałem CKEditor w trybie modalnym, używając Foundation. Idealnie zniszczyłbym redaktora po zamknięciu, jednak nie chciałem zadzierać z Fundacją.
Zadzwoniłem do delete, próbowałem usunąć i innej metody, ale z tym w końcu się zdecydowałem.
Używałem textarea do wypełnienia, a nie DIV.
Moje rozwiązanie
to była moja metoda zwracania mojego określonego formatowania, którego możesz nie chcieć.
źródło
Spróbuj tego:
źródło