Wiele wystąpień CKEditor (w Safari) [duplikat]

Mam problem z tworzeniem wielu wystąpień CKEditor w oknie dialogowym interfejsu użytkownika JQuery. Okno dialogowe ładuje formularz zdalny za pośrednictwem AJAX, więc celem jest możliwość zamknięcia i ponownego otwarcia okna dialogowego oraz posiadania nowej instancji edytora. Przy domyślnych opcjach przy ponownym otwarciu okna pojawia się błąd mówiący, że edytor o tej nazwie już istnieje. Wypróbowałem więc kilka metod niszczenia instancji edytora i wszystkie powodują ten sam problem. Po ponownym załadowaniu edytora w polu tekstowym pojawia się komunikat null, a przyciski nie działają.

Obecnie używam tej metody niszczenia instancji:

var instance = CKEDITOR.instances['test'];
if (instance) { CKEDITOR.remove(CKEDITOR.instances['test']); }

Odtworzyłem problem za pomocą kilku prostych plików html dostępnych do pobrania tutaj.

EDYTUJ: Właśnie próbowałem użyć dwóch zdalnych plików z obszarem tekstowym, który ma inną nazwę i mam ten sam problem. Kiedy jedno okno dialogowe jest otwierane, a następnie zamykane, drugie okno dialogowe ma "null" CKEditor po otwarciu.

Poza tym najwyraźniej jest to tylko problem w Safari.


person seth    schedule 02.12.2009    source źródło


Odpowiedzi (3)


oto co zrobiłem:

var CKeditors = {};
function loadEditors() {
    var $editors = $("textarea.ckeditor");
    if ($editors.length) {
        $editors.each(function() {
            var editorID = $(this).attr("id");
            if(CKeditors[editorID]){
                CKeditors[editorID].destroy();
                CKeditors[editorID] = null;
            }

            var dst = editorID+'-element';
            var html = '';
            if( $(this).val() ){
                html = $(this).val();
            }
            CKeditors[editorID] = CKEDITOR.appendTo(dst, {}, html);
        });
        $("textarea.ckeditor").hide();
    }
}

function updateCKEditors() {
    for(x in CKeditors){
        $("#"+x).val(CKeditors[x].getData());
    }
}

potem po sukcesie ajax robię

loadEditors()

a przed wysłaniem formularza (na przykład za pomocą ajax):

updateCKEditors()

potrzebujesz jQuery, aby to działało. dotyczy to zend_forms, ale po kilku poprawkach powinno działać również w normalnych formach. grać z 'dst', aby to zrobić.

person activ    schedule 31.03.2011

Trochę stary temat, ale miałem podobny problem.

Użyłem powyższego rozwiązania activa, które świetnie się sprawdziło! CKEDITOR.appendTo mi nie wyszło, ale z następną niewielką modyfikacją funkcji loadEditors tak się stało:

function loadEditors() {
    var $editors = $("textarea.ckeditor");
    if ($editors.length) {
        $editors.each(function() {
            var editorID = $(this).attr("id");
            if(CKeditors[editorID]){
                CKeditors[editorID].destroy();
                CKeditors[editorID] = null;
            }

            var dst = editorID+'-element';
            CKeditors[editorID] = CKEDITOR.replace(dst, {});
        });
    }
}
person Tom Cool    schedule 21.02.2012

co robię:

var instance = CKEDITOR.instances['test'];
instance.destroy();
instance = null;
person Scott Evernden    schedule 02.12.2009
comment
Właśnie próbowałem, ale otrzymuję ten sam błąd. Myślę, że to musi mieć coś wspólnego z JQueryUI/AJAX. - person seth; 03.12.2009