Как настроить CKEditor для нескольких экземпляров с разной высотой?

Я хотел бы иметь несколько экземпляров CKEditor на основе тех же настроек конфигурации, но с разной высотой. Я попытался настроить конфигурацию с высотой по умолчанию, настроив первый экземпляр, затем переопределив высоту и установив второй экземпляр:

var config = {
    .....
    height:'400'
};

$('#editor1').ckeditor(config);
config.height = '100';
$('#editor2').ckeditor(config);

... но я получаю два экземпляра CKEditor, которые имеют высоту 100 пикселей.

Я также пробовал это:

CKEDITOR.replace('editor2',{
    height: '100'
});

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

В конце концов я настроил две разные конфигурации и скопировал свойство toolbar_Full:

var config1 = {
    height:'400',
    startupOutlineBlocks:true,
    scayt_autoStartup:true,
    toolbar_Full:[
        { name: 'clipboard', items : [ 'Cut','Copy','Paste','PasteText','PasteFromWord','-','Undo','Redo' ] },
        { name: 'editing', items : [ 'Find','Replace','-' ] },
        { name: 'basicstyles', items : [ 'Bold','Italic','Underline','Strike','Subscript','Superscript','-','RemoveFormat' ] },
        { name: 'paragraph', items : [ 'NumberedList','BulletedList','-','Outdent','Indent','-','Blockquote','-','JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock','-','BidiLtr','BidiRtl' ] },
        '/',
        { name: 'links', items : [ 'Link','Unlink','Anchor' ] },
        { name: 'insert', items : [ 'Image','HorizontalRule' ] },
        { name: 'styles', items : [ 'Styles','Format','Font','FontSize' ] },
        { name: 'colors', items : [ 'TextColor','BGColor' ] },
        { name: 'tools', items : [ 'Maximize', 'ShowBlocks' ] },
        { name: 'document', items : [ 'Source' ] }
    ]
}

var config2 = {
    height:'100',
    startupOutlineBlocks:true,
    scayt_autoStartup:true
};
config2.toolbar_Full = config1.toolbar_Full;

$('#editor1').ckeditor(config1);
$('#editor2').ckeditor(config2);

Есть ли лучший способ? Что-нибудь мне не хватает? Там этот вопрос, но они не опубликовали достаточно, чтобы быть полезными, и этот очень похожий вопрос hasn ' ответили. Спасибо!

Update:

Это, по-видимому, сложность обращения к настройке времени/конфигурации CKEditor - конфигурация читается и применяется позже (я предполагаю, что после настройки рамки DOM редактора), а не при первом экземпляре редактора.

Таким образом, любые изменения настроек конфигурации, сделанные сразу после создания первого редактора с помощью .ckeditor(), фактически применяются редактором в какой-то момент в следующие несколько миллисекунд. Я бы сказал, что это ненормальное поведение или логическое.

Например, вы можете получить ожидаемое поведение в моем первом примере (переопределяя свойство config.height после создания первого редактора) для работы, задерживая второй экземпляр CKEditor с помощью setTimeout(). Firefox необходимо ~ 100 мс, IE нужно 1 мс. Нелепый и неправильный.

CKEditor должен прочитать настройки конфигурации, когда каждый редактор сначала создается. На данный момент все должны работать над этой причудой.

Ответ 1

Самый простой способ инициализации двух редакторов с пользовательскими высотами:

$('#editor1').ckeditor({ height: 100 });
$('#editor2').ckeditor({ height: 200 });

или без jQuery:

CKEDITOR.replace('editor1', { height: 100 });
CKEDITOR.replace('editor2', { height: 200 });

AFAIK невозможно изменить высоту редактора на лету.

Если эти методы не работали для вас, тогда вы делали не так.

Update:

Отвечая на ваш комментарий, ваш вопрос на самом деле был не о CKEditor, а скорее о совместном использовании одного объекта только с двумя разными свойствами. Поэтому вы можете попробовать следующее:

var configShared = {
        startupOutlineBlocks:true,
        scayt_autoStartup:true,
        // etc.
    },
    config1 = CKEDITOR.tools.prototypedCopy(configShared),
    config2 = CKEDITOR.tools.prototypedCopy(configShared);
config1.height = 100;
config2.height = 200;

CKEDITOR.replace('editor1', config1);
CKEDITOR.replace('editor2', config2);

CKEDITOR.tools.prototypedCopy - это инструмент, который создает новый объект с прототипом, установленным на переданный. Таким образом, они делят все свойства, за исключением того, что вы переопределяете позже.

Обновление 2:

Это обновление для раздела "Обновление" в вопросе:).

В CKEditor нет никакой ошибки или ошибки или вообще - это чистый JavaScript и как работают BOM/DOM и браузеры, а также некоторый практический подход.

Первое: 90% BOM/DOM синхронно, но есть несколько вещей, которые нет. Из-за этого весь редактор должен иметь асинхронный характер. Поэтому он обеспечивает так много событий.

Второе - в объекте JS передаются по ссылке, и, поскольку мы хотим, чтобы CKEditor очень быстро инициализировался, мы должны избегать ненужных задач. Одним из них является копирование объекта конфигурации (без уважительной причины). Таким образом, чтобы сохранить несколько мсек (и из-за загрузки асинхронных подключаемых модулей), CKEditor расширяет переданный объект конфигурации только путем установки его прототипа объекту, содержащему параметры по умолчанию.

Подведение итогов - я знаю, что это может выглядеть как ошибка, но это работает как JS/BOM/DOM libs. Я почти уверен, что многие асинхронные методы других libs затронуты одной и той же проблемой.

Ответ 2

Добавьте это, вы получите другую панель инструментов для CKeditor на одной странице

<script>

    CKEDITOR.on('instanceCreated', function (event) {
        var editor = event.editor,
            element = editor.element;

        if (element.is('h1', 'h2', 'h3') || element.getAttribute('id') == 'editorTitle') {
            editor.on('configLoaded', function () {
                // Remove unnecessary plugins to make the editor simpler.
                editor.config.removePlugins = 'find,flash,' +
                    'forms,iframe,image,newpage,removeformat,' +
                    'smiley,specialchar,stylescombo,templates';

                // Rearrange the layout of the toolbar.
                editor.config.toolbarGroups = [
                    { name: 'editing', groups: ['basicstyles'] },
                    { name: 'undo' },
                    //{ name: 'clipboard', groups: ['selection', 'clipboard'] },
                  { name: 'styles' },
                    { name: 'colors' },
                    { name: 'tools' }
                  //  { name: 'about' }
                ];
            });
        }
    });

</script>

Ответ 3

Решение выше от Рейнмара работает для меня, однако я решил дать еще одно решение, которое я использовал до этого.

Это очень просто, все, что вам нужно знать, это то, что ckeditor создает элемент контента div для каждого экземпляра с почти одним и тем же идентификатором, только разница - это инкрементное значение. Так что если у вас 2,3,4.. экземпляров, то разница будет порядковым номером. Код находится здесь:

    CKEDITOR.on('instanceReady', function(){
    $('#cke_1_contents').css('height','200px');
}); 

Это событие будет активировано для каждого вашего экземпляра, поэтому, если вы хотите установить высоту для всех экземпляров, вы можете создать глобальную переменную и использовать ее как x в #cke_"+x+"contents, каждый раз, когда событие активируется, увеличьте x на 1, проверьте какой экземпляр в строке имеет простую, если и затем устанавливает высоту.

    var x=1;
CKEDITOR.on('instanceReady', function(){
    if(x==1) h='200px';
    else if(x==2)h='400px';
    else if(x==3)h='700px';
    $('#cke_'+x+'_contents').css('height',h);
    x++;
}); 

Это не лучшее решение, но оно работает, проблема в том, что вы на самом деле видите изменение содержимого div.

Ответ 4

Если вы добавите ckeditor.js на страницу более одного раза, это может вызвать эту проблему. Код script должен быть определен один раз на каждой странице. <script type="text/javascript" src="Fck342/ckeditor.js"></script>

Ответ 5

просто используйте CKEDITOR.replaceAll();

Ответ 6

Обновление 25 июня 2019 г.

Пожалуйста, используйте этот код, чтобы добавить несколько экземпляров CKEditor с индивидуальной высотой для каждого. Самый простой способ.

  <textarea name="editor1" style="height:30px;" class="ckeditor"></textarea>
   <script type="text/javascript">
      CKEDITOR.replace( 'editor1' );
      CKEDITOR.add            
   </script>

<textarea name="editor2" style="height:40px;" class="ckeditor"></textarea>
   <script type="text/javascript">
      CKEDITOR.replace( 'editor2' );
      CKEDITOR.add            
   </script>

<textarea name="editor3" style="height:50px;" class="ckeditor"></textarea>
   <script type="text/javascript">
      CKEDITOR.replace( 'editor3' );
      CKEDITOR.add            
   </script>

<textarea name="editor4" style="height:60px;" class="ckeditor"></textarea>
   <script type="text/javascript">
      CKEDITOR.replace( 'editor4' );
      CKEDITOR.add            
   </script>

<textarea name="editor5" style="height:70px;" class="ckeditor"></textarea>
   <script type="text/javascript">
      CKEDITOR.replace( 'editor5' );
      CKEDITOR.add            
   </script>

Ссылка: здесь