У меня проблема с созданием нескольких экземпляров CKEditor в диалоговом окне JQuery UI. Диалог загружает удаленную форму через AJAX, поэтому цель состоит в том, чтобы иметь возможность закрыть и снова открыть диалоговое окно и получить новый экземпляр редактора. При использовании параметров по умолчанию при повторном открытии диалогового окна появляется сообщение об ошибке, в котором говорится, что редактор с таким именем уже существует. Итак, я попробовал несколько методов уничтожения экземпляра редактора, и все они привели к одной и той же проблеме. Когда редактор перезагружается, в текстовой области отображается null, и кнопки не работают.
В настоящее время я использую этот метод уничтожения экземпляра:
var instance = CKEDITOR.instances['test'];
if (instance) { CKEDITOR.remove(CKEDITOR.instances['test']); }
Я воссоздал проблему с помощью пары простых файлов HTML, доступных для загрузки здесь.
РЕДАКТИРОВАТЬ: Я только что попытался использовать два удаленных файла с текстовой областью с другим именем, и у меня такая же проблема. Когда одно диалоговое окно открывается и затем закрывается, другое диалоговое окно имеет "нулевой" CKEditor, когда он открывается.
Кроме того, видимо, это проблема только Safari.
Ответ 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, {});
});
}
}