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

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

Uncaught TypeError: Cannot read property 'document' of null

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

i.contentWindow is null

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

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


person Joseph Silber    schedule 01.11.2011    source источник


Ответы (3)


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

person Erik Čerpnjak    schedule 17.01.2012
comment
Это решило аналогичную (ту же?) проблему для меня (заменив ckeditor на основе возврата вызова AJAX), но я все еще получаю Uncaught TypeError (такой же, как в OP). Я не уверен, есть ли какие-либо побочные эффекты, но я хотел бы избавиться от сообщения об ошибке. Мой код для загрузки редактора: ‹code›window.makeCkEditor = function(e, w, h) { var cki, config, ei; ei = CKEDITOR.instances[e]; если (ei) ei.destroy(true); config = {ширина: w, высота: h}; вернуть cki = CKEDITOR.replace(e, config); };‹/code› Любые идеи о том, как я могу избавиться от msg? - person Mark Fraser; 11.03.2012
comment
@KenThompson: у меня немного другой подход, но пытались ли вы уничтожить объект ck перед вызовом AJAX? - person Erik Čerpnjak; 22.03.2012
comment
Только что столкнулся с этой проблемой, и, как и было обещано, detroy(true) работал над ее устранением. Благодарю вас! - person user1072910; 24.03.2014

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

person AlfonsoML    schedule 01.11.2011
comment
Я немного новичок в командной строке; Как применить этот патч? Я работаю на Windows 7 x64. - person Joseph Silber; 01.11.2011
comment
Просто сделать это может быть слишком сложно. Я работаю так, как имею копию SVN, это легко сделать с TortoiseSVN, затем с помощью контекстного меню в папке используйте параметр Patch, после чего вам нужно переупаковать весь код CKEditor (поэтому вам также необходимо установить Java). Обидно, что от вас требуют проделать все эти шаги только потому, что им не понравился патч и предложили что-то более сложное, что в итоге так и не было добавлено. - person AlfonsoML; 01.11.2011
comment
Что ж, поскольку я не использую SVN, я просмотрел файл patch и внес все эти изменения вручную. Теперь все эти изменения находились в папке _source. Я предполагаю, что ckeditor.js каким-то образом скомпилирован/объединен/сжат из всех этих файлов. Как мне это сделать? - person Joseph Silber; 02.11.2011
comment
Этот документ объясняет сжатие: docs.cksource.com/CKEditor_3.x/Developers_Guide/CKPackager Но хотя там и указано, что есть исполняемый файл, кажется, что вам все равно нужна среда Java, так что я бы забыл об этом. - person AlfonsoML; 02.11.2011
comment
Все сработало. Я не думаю, что вам нужна среда Java с exe. - person Joseph Silber; 04.11.2011
comment
Большой. Кто-то заявил, что это не работает без установленной Java, и я доверился ему, вместо того, чтобы пытаться это проверить. - person AlfonsoML; 04.11.2011

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

person eon    schedule 30.01.2013
comment
Нет проблем, рад, что смог помочь - person Erik Čerpnjak; 10.04.2014