Читая документацию CKEditor, я вижу, что у них есть вариант чтобы уничтожить экземпляр с помощью CKEDITOR.instances.instanceName.destroy();. Однако, если DOM изменился и вся структура WYSIWYG DOM была удалена, я получаю следующую ошибку в Chrome:
Uncaught TypeError: Cannot read property 'document' of null
... и следующий в Firefox:
i.contentWindow is null
Есть ли способ обойти это?
Из-за того, как устроено мое приложение (загрузка контента через AJAX), я не могу вызвать .destroy(), когда элементы все еще находятся на странице.
Ответ 1 · рейтинг 15 · Erik Čerpnjak
Если вам нужно уничтожить объект ckeditor и элементы в DOM ПОСЛЕ вызова AJAX, вы можете сделать это, установив логический параметр для вызова функции destroy(true). Таким образом, он не будет пытаться обновить DOM:
var editor = CKEDITOR.instances[name];
if (editor) { editor.destroy(true); }
CKEDITOR.replace(name);
Я написал 2 функции, чтобы лучше контролировать эти вещи. Обратите внимание, что я объявил переменную до того, как эти функции можно будет использовать, но есть много более гладких способов, но этот подход был достаточно хорош для той цели, которая мне нужна (я использую и нуждаюсь только в одном экземпляре):
if(typeof(editor) == 'undefined')
var editor=null;
function ck_delete(editor)
{
if(typeof(editor) != 'undefined' && editor!=null)
editor.destroy();
}
function ck_init(ck_inst_name)
{
var el_id=document.getElementById(ck_inst_name);
if(typeof(el_id) != 'undefined' && el_id!=null)
{
if(typeof(editor) == 'undefined' || editor==null)
{
editor=CKEDITOR.replace( ck_inst_name );
}
else
{
ck_delete(editor);
editor=null;
editor = CKEDITOR.replace( ck_inst_name );
}
}
}
Я также проверяю, существует ли элемент HTML, который следует заменить, поэтому я не получаю сообщения об ошибке.
Ответ 3 · рейтинг 1 · eon
У нас возникла проблема с интеграцией CKEDITOR в GWT во всплывающем диалоговом окне. Когда диалоговое окно было уничтожено, CKEDITOR выдал эту ошибку - "Невозможно прочитать документ свойства null". Решение состояло в том, чтобы уничтожить CKEDITOR перед закрытием диалога. (Нам пришлось расширить класс GWT ckeditor, чтобы переопределить это, используя синтаксис editor.destroy(true), предоставленный Эриком - спасибо, Эрик!)