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

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

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

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

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

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

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

3 ответа

Немного старой темы, но у меня была похожая проблема.

Я использовал выше решение 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, {});
        });
    }
}

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

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 succes я делаю

loadEditors()

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

updateCKEditors()

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

Что я делаю:

var instance = CKEDITOR.instances['test'];
instance.destroy();
instance = null;
Другие вопросы по тегам