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

Вопрос

CKEditor - уничтожить экземпляр, когда узел DOM был удален

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

Читая документацию CKEditor, я вижу, что у них есть вариант чтобы уничтожить экземпляр с помощью CKEDITOR.instances.instanceName.destroy();. Однако, если DOM изменился и вся структура WYSIWYG DOM была удалена, я получаю следующую ошибку в Chrome:

Uncaught TypeError: Cannot read property 'document' of null

... и следующий в Firefox:

i.contentWindow is null

Есть ли способ обойти это?

Из-за того, как устроено мое приложение (загрузка контента через AJAX), я не могу вызвать .destroy(), когда элементы все еще находятся на странице.

javascriptajaxckeditorwysiwyg

Ответы

Ответ 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, который следует заменить, поэтому я не получаю сообщения об ошибке.

Ответ 2 · рейтинг 2 · AlfonsoML

Вы можете применить одно из исправлений на странице http://dev.ckeditor.com/ticket/8226. и это сработает. Я предлагаю этот: http://dev.ckeditor.com/attachment/ticket/8226/8226_5.patch

Ответ 3 · рейтинг 1 · eon

У нас возникла проблема с интеграцией CKEDITOR в GWT во всплывающем диалоговом окне. Когда диалоговое окно было уничтожено, CKEDITOR выдал эту ошибку - "Невозможно прочитать документ свойства null". Решение состояло в том, чтобы уничтожить CKEDITOR перед закрытием диалога. (Нам пришлось расширить класс GWT ckeditor, чтобы переопределить это, используя синтаксис editor.destroy(true), предоставленный Эриком - спасибо, Эрик!)

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

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