событие ckeditor onKeyUp как?

Этот фрагмент кода должен копировать текст из текстовой области text в текстовую область text_hidden, этот код работает без ckeditor.

onKeyUp="document.getElementById('text_hidden').value = this.value;

но когда ckeditor включен

onKeyUp="document.getElementById('text_hidden').value = this.value; не работает.

Как это исправить?

<textarea name="text" id="text" rows="6" cols="80"  onKeyUp="document.getElementById('text_hidden').value = this.value;" ></textarea></p>

<textarea name="text_hidden" id="text_hidden" rows="6" cols="80" ></textarea>

<script>
        CKEDITOR.replace( 'text' ,
        {   
    allowedContent: true,
    enterMode: CKEDITOR.ENTER_BR,

    });
        CKFinder.SetupCKEditor( editor, '/ckfinder/' );
        config.startupPath = "/files/";
</script>

person Volodymyr Oliinyk    schedule 02.04.2014    source источник


Ответы (3)


Если вы хотите синхронизировать WYSIWYG-контент с текстовой областью, просто укажите событие on change в качестве опции для обновления базового элемента.

CKEDITOR.replace('editor', {
    on: {
          change: function() {
              this.updateElement();    
          }
    }
});
person Fabian Picone    schedule 23.06.2017
comment
Мой ничего не менял. - person Scramble; 16.10.2018

Вот моя демонстрация синхронизации CKEditor-to-textarea и наоборот: https://jsfiddle.net/ty5ks393/1/. Введите одно из трех белых полей и посмотрите, как содержимое реплицируется во всех четырех контейнерах.

Он использует Bootstrap для поддержания порядка и показывает как классический, так и встроенный CKEditors. Соответствующие части (без внешних ресурсов, комментариев и console.logs) извлекаются здесь:

    <div class="row">
        <div class="col-sm-3">
            <h2>TEXTAREA</h2>
            <textarea id="textarea" class="box"></textarea>
        </div>
        <div class="col-sm-3">
            <h2>CK EDITOR INLINE</h2>
            <div contenteditable="true" id="contentedit" class="box"></div>
        </div>
        <div class="col-sm-3">
            <h2>CK EDITOR</h2>
            <textarea id="ckeditor" class="box"></textarea>
        </div>
        <div class="col-sm-3">
            <h2>RESULT DIV</h2>
            <div id="result" class="box"></div>
        </div>  
    </div>

И jQuery:

    $(function() {
        CKEDITOR.disableAutoInline = true;
        var ce = CKEDITOR.inline("contentedit", {
            removePlugins: 'toolbar'
        });
        var ck = CKEDITOR.replace('ckeditor').on('change', function(e) {
            if (document.activeElement.nodeName == "IFRAME") {
                var thisHTML = e.editor.getData();
                var tempDiv = $('<div>').html(thisHTML);
                thisText = tempDiv.text();
                $('#textarea').val(thisText);
                $('#contentedit, #result').html(thisHTML);  
            }
        });

        var timer;

        $('#textarea').keyup(function() {
            var _this = this;
            clearTimeout(timer);
            timer = setTimeout(function() {
                var thisText =$(_this).val().replace(/\n/g, "<br/>");
                $('#result, #contentedit').html(thisText);
                CKEDITOR.instances.ckeditor.setData(thisText);
            }, 200);
        });

        $('#contentedit').keyup(function(e) {
            var _this = this;
            clearTimeout(timer);
            timer = setTimeout(function() {
                var thisHTML = $(_this).html();
                var tempDiv = $('<div>').html(thisHTML.replace(/\<\/p\>/g,"</p>\n\n"));
                thisText = tempDiv.text();
                $('#textarea').val(thisText);
                $('#result').html(thisHTML);
                CKEDITOR.instances.ckeditor.setData(thisHTML);
            }, 200);
        });
    });

Поэтому я использую тайм-аут, чтобы избежать узких мест, возникающих при использовании keyup при использовании setData(). И я определяю, нахожусь ли я в IFRAME, чтобы убедиться, что я не отбрасываю изменения содержимого обратно из CKEditor, когда я изменил содержимое из одного из других контейнеров с помощью setData().

Я надеюсь, что это поможет некоторым из вас.

person MSC    schedule 21.07.2015

После поиска я нашел статью (ckeditor-keyup-event) о том, что API CKEditor не поддерживает событие keyup. Поддерживается только метод key, который прослушивает событие нажатия клавиши.

Автор статьи использует editor.document.on('keyup') в обратном вызове editor.setData(), который доступен только после инициализации.

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

CKEDITOR.replace( 'text' ,
{   
    allowedContent: true,
    enterMode: CKEDITOR.ENTER_BR,
}).on('key',
    function(e){
        setTimeout(function(){
            document.getElementById('text_hidden').value = e.editor.getData();
        },10);
    }
);

Без функции setTimeout() getData() не будет захватывать последнее нажатие клавиши.

person Hanafi    schedule 10.07.2014
comment
Это настолько распространенный вариант использования, что смешно, что keyup не поддерживается. Им нужно выпустить четкую документацию и видео на Youtube, показывающее, как это должно работать. - person MSC; 14.07.2015
comment
Сказав это, я заставил его работать с keyup и без setTimeout после долгих проб и ошибок и чтения Stackoverflow. - person MSC; 14.07.2015
comment
@MSC, можешь опубликовать свой рабочий пример? Я хотел бы попробовать это. - person Hanafi; 21.07.2015
comment
Я бы порекомендовал добавить к этому какую-то функцию дросселирования, это займет много циклов процессора у браузера, если он действительно выполняет setTimeout после каждого отдельного ключа; представьте, что вы печатаете быстро — что это будет делать? Я легко могу себе представить, что два нажатия клавиши приходятся на 10-миллисекундное окно, поэтому новые тайм-ауты могут фактически начаться после того, как старые тайм-ауты все еще ждут. - person Joel Peltonen; 23.07.2015