Несколько экземпляров CKEditor (в Safari)

У меня проблема с созданием нескольких экземпляров CKEditor в диалоговом окне JQuery UI. Диалог загружает удаленную форму через AJAX, поэтому цель состоит в том, чтобы иметь возможность закрыть и снова открыть диалоговое окно и получить новый экземпляр редактора. При использовании параметров по умолчанию при повторном открытии диалогового окна появляется сообщение об ошибке, в котором говорится, что редактор с таким именем уже существует. Итак, я попробовал несколько методов уничтожения экземпляра редактора, и все они привели к одной и той же проблеме. Когда редактор перезагружается, в текстовой области отображается null, и кнопки не работают.

В настоящее время я использую этот метод уничтожения экземпляра:

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

Я воссоздал проблему с помощью пары простых файлов HTML, доступных для загрузки здесь.

РЕДАКТИРОВАТЬ: Я только что попытался использовать два удаленных файла с текстовой областью с другим именем, и у меня такая же проблема. Когда одно диалоговое окно открывается и затем закрывается, другое диалоговое окно имеет "нулевой" CKEditor, когда он открывается.

Кроме того, видимо, это проблема только Safari.


person seth    schedule 02.12.2009    source источник


Ответы (3)


arrow_upward
1
arrow_downward

вот что я сделал:

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());
    }
}

затем после успеха ajax я делаю

loadEditors()

и перед отправкой формы (например, с использованием ajax):

updateCKEditors()

вам нужен jQuery, чтобы это работало. это для zend_forms, но после некоторых исправлений он должен работать и в обычных формах. для этого поиграйте с dst.

person activ    schedule 31.03.2011

arrow_upward
1
arrow_downward

Немного старая тема, но у меня была аналогичная проблема.

Я использовал решение activ, описанное выше, и оно отлично сработало! CKEDITOR.appendTo не сработал для меня, но со следующей небольшой модификацией функции loadEditors это сработало:

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

arrow_upward
0
arrow_downward

что я делаю:

var instance = CKEDITOR.instances['test'];
instance.destroy();
instance = null;
person Scott Evernden    schedule 02.12.2009
comment
Просто попробовал, но получаю ту же ошибку. Я думаю, это как-то связано с JQueryUI / AJAX. - person seth; 03.12.2009