Несколько экземпляров 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;