Я только начал использовать CKEditor, и мне не удается достаточно хорошо понять API, чтобы выполнить то, к чему я стремлюсь.
По сути, у меня есть несколько экземпляров редактора на странице. Однако для редактора по имени htmlInput я хочу собрать имена элементов формы, которые добавляются в редактор. Самое близкое, что я получил, - это всплывающее предупреждение при открытии соответствующих диалоговых окон, но мне не удалось извлечь значение поля имени этих полей.
Вот что у меня есть до сих пор.
CKEDITOR.on('dialogDefinition', function (e) {
var dialogName = e.data.name;
var dialog = e.data.definition.dialog;
if(e.editor.name == 'htmlInput' && (dialogName=='checkbox' || dialogName=='radio' || dialogName=='textfield' || dialogName == 'textarea' || dialogName == 'select'))
{
dialog.on('show', function (ev) {
alert('here');
});
}
});
Ответ 1 · oleq
То, что вы пытаетесь сделать, очень небезопасно. Представьте, что если бы кто-то вставил такой элемент формы или воспользовался методом editor.insertHtml(). Их не соберут. Лучший подход заключается в следующем:
var form = {};
CKEDITOR.instances.editor1.dataProcessor.htmlFilter.addRules({
elements: {
$: function( element ) {
if ( element.name in { 'input' : 1, 'textarea': 1, 'button' : 1 } ) {
if ( !form[ element.name ] )
form[ element.name ] = [];
form[ element.name ].push( element );
}
}
}
});
Теперь, когда вы можете в основном сделать следующее:
CKEDITOR.instances.editor1.getData();
console.log( form );
Затем вы извлечете все элементы формы (или элементы любого типа), принадлежащие документу. Просто убедитесь, что ваш объект form пуст при сериализации форм, т.е. htmlFilter также выполняется при переключении между режимом источника ‹-> wysiwyg, и он будет постоянно заполнять ваш список.
Вы также можете использовать следующее для извлечения элементов по имени тега (простой способ IMO):
CKEDITOR.instances.editor1.document.getElementsByTag( 'input' );