Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: sethОтветов: 3

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

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

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

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

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

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

javascriptjquerysafarickeditor

Ответы

Ответ 1 · рейтинг 1 · activ

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

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.

Ответ 2 · рейтинг 1 · Tom Cool

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

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

Ответ 3 · Scott Evernden

что я делаю:

var instance = CKEDITOR.instances['test'];
instance.destroy();
instance = null;

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы