Как правильно уничтожить экземпляр CKEditor?

Я запускаю CKeditor 3.4 на довольно простой странице. У меня возникает проблема (иногда), когда я вызываю document.main_form.submit(), он не отправляет содержимое текстовой области. После некоторого чтения кажется, что CKeditor не уничтожает должным образом. Я пытался вручную уничтожить его, прежде чем сохранить форму, но не смог его вызвать. Странно то, что иногда это работает, а иногда нет. Я использую Chrome, так что это может быть ошибкой, но то же самое происходит и в Firefox.

Как я могу правильно уничтожить CKeditor, чтобы он всегда отправлял данные текстовой области в POST. Спасибо!


person Shane Reustle    schedule 31.08.2010    source источник


Ответы (6)


У меня была эта проблема. Как больно.

Чтобы правильно уничтожить экземпляр редактора, попробуйте

if (CKEDITOR.instances.myInstanceName) CKEDITOR.instances.myInstanceName.destroy();

Из документации здесь

Я решил проблему с отсутствующим содержимым, назначив содержимое редактора скрытому полю перед обратной передачей. Я использую ASP.Net, но он должен работать повсеместно.

в обработчике щелчка кнопки отправки на стороне клиента вызовите

if (CKEDITOR.instances.myInstanceName)
    document.getElementById('hiddenField').value = CKEDITOR.instances.getData();
person Laramie    schedule 31.08.2010
comment
как узнать, что такое «myInstanceName»? Это идентификатор редактора? - person rmcsharry; 13.10.2017

Однажды я использовал ui-router angularjs с одним экземпляром CKEDITOR для каждого подпредставления. Я использовал следующее решение для очистки экземпляров каждый раз, когда загружаю пользовательский интерфейс.

for(name in CKEDITOR.instances)
{
    CKEDITOR.instances[name].destroy()
}
person Bernie GGGG    schedule 06.12.2014
comment
Это лучшее решение. В моем случае каждый раз, когда пользователь посещает маршрут, на котором загружается редактор, имя экземпляра меняется... с editor1 на editor2 и т. д. Поскольку я не могу легко предсказать имя экземпляра, циклически просматривая их все, как это работает. Спасибо! - person rmcsharry; 13.10.2017
comment
это решение является лучшим. благодарю вас :) - person sagar; 23.04.2021

В моей ситуации

CKEDITOR.instances.myInstanceName.destroy();

не помогло, потому что я открыл CKEditor в jquery dialog двойным щелчком по какому-то элементу. Когда я закрывал редактор, а затем открывал его снова, мой код давал сбой.
Решение заключалось в использовании

CKEDITOR.instances.myInstanceName.destroy(false);

который обновил элемент DOM (ссылка на документацию).

person Tomasz Dzięcielewski    schedule 06.03.2013
comment
Мы также открываем наши CKEditors в диалоговом окне jquery. Мы использовали CKEDITOR.instances.myInstanceName.destroy(true);, что также приводило к сбою нашего кода из-за ошибки TypeError: a is null. Однако переход на false не решил нашу проблему. Пришлось обернуть эту строку кода в try/catch - person jgerman; 01.07.2014

используйте этот простой код. Обратите внимание, что идентификатор моей текстовой области — editor1.
или Вы также можете проверить это с помощью console.log(CKEDITOR.instances.editor1);

if (CKEDITOR.instances.editor1) {
     CKEDITOR.instances.editor1.destroy();
}
person Sandeep Sherpur    schedule 26.07.2016

for(name in CKEDITOR.instances){ CKEDITOR.instances[name].destroy() }

Используйте для кода, чтобы уничтожить все экземпляры, созданные ckeditor

person ashish naghate    schedule 15.10.2017

решение, которое, наконец, сработало.

Проблема заключалась в том, что вы уничтожаете ckeditor и впоследствии пытаетесь заменить текстовое поле, которое не работает.

Я нашел этот простой пример, который дал мне ключ. Используйте div и добавьте ckeditor вместо вызова замены API

http://ckeditor.com/latest/samples/old/ajax.html

<div id='emailEditor1'>
              </div>

function closeTab() {
    emailEditor1.destroy();
    emailEditor1 = null;
}

function createEditor() 
    if (emailEditor1 == null) {
        emailEditor1 = CKEDITOR.appendTo( 'emailEditor1');
    }
}
person Will Berger    schedule 21.09.2016