CKEditor - уничтожить экземпляр, когда узел DOM был удален - PullRequest
9 голосов
/ 01 ноября 2011

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

Uncaught TypeError: Cannot read property 'document' of null

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

i.contentWindow is null

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

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

Ответы [ 3 ]

16 голосов
/ 17 января 2012

Если вам нужно уничтожить объект ckeditor и elemnets в 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 голосов
/ 01 ноября 2011

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

1 голос
/ 31 января 2013

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

...