CkEditor - Uncaught TypeError: Невозможно прочитать свойство 'getSelection' из неопределенного

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

Cannot read property 'getSelection' of undefined

в нижней строке ckeditor

getNative: function() {
 return void 0 !== this._.cache.nativeSel ? this._.cache.nativeSel : this._.cache.nativeSel = B ? this.document.$.selection : this.document.getWindow().$.getSelection() }

Буду признателен за любую оказанную помощь.

6 ответов

  1. У меня есть список статей.
  2. каждый раз, когда я нажимаю на какую-либо статью, должен быть открыт "диалог / модал".
  3. в таком диалоге или модале был элемент ckeditor для содержания моей статьи.
  4. когда я нажал на первый, он работал как шарм.
  5. проблема была после нажатия на 2-й, 3-й, 4-й и т. д.

потом у меня появилась эта ошибка.

    TypeError: Cannot read property 'getSelection' of undefined
    at CKEDITOR.dom.selection.getNative (ckeditor.js:448)
    at new CKEDITOR.dom.selection (ckeditor.js:446)
    at a.CKEDITOR.editor.getSelection (ckeditor.js:443)
    at new CKEDITOR.plugins.undo.Image (ckeditor.js:1182)
    at CKEDITOR.plugins.undo.UndoManager.save (ckeditor.js:1177)
    at a.<anonymous> (ckeditor.js:1173)
    at a.n (ckeditor.js:10)
    at a.CKEDITOR.event.CKEDITOR.event.fire (ckeditor.js:12)
    at a.CKEDITOR.editor.CKEDITOR.editor.fire (ckeditor.js:13)
    at a.setData (ckeditor.js:275)

решение для меня было простым, скажите компьютеру уничтожить экземпляр ckeditor, когда диалоговое окно / модальное окно закрыто. просто!.. сейчас работает как шарм =)

           $mdDialog.show({
             parent:      parentEl,
             targetEvent: $event,
             templateUrl: '/md-templates/blog-article.html',
             controller:  DialogController,
             scope:         $scope,
             preserveScope: true,
            onRemoving: function (event, removePromise) {
                if (CKEDITOR.instances.body) CKEDITOR.instances.body.destroy();
            }
        });

Я получил ту же ошибку, и я решил инициализировать CKEditor, в $(document).function(ready());

$(document).ready(function () {
    CKEDITOR.replace('editor1', {
        language: 'tr',
        height: '300'
    });
});

Я думаю, что когда вы инициализируете перед загрузкой страницы, он не находит элемент dom (textarea)

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

Во-первых, CKEditor одобрил метод тестирования, если редакторloaded первый.

if ( CKEDITOR.status == 'loaded' ) {
    // The API can now be fully used.
    doSomething();
} else {
    // Wait for the full core to be loaded and fire its loading.
    CKEDITOR.on( 'load', doSomething );
    CKEDITOR.loadFullCore && CKEDITOR.loadFullCore();
}

Во-вторых, если вы не можете контролировать время, связанное с установкой значения редактора, вы можете обернуть CKEDITOR.dom.window объект в async/await Promiseэто проверяет, загружен ли редактор первым, а если нет, ожидает загрузки редактора, а затем завершает установку значения. (обратите внимание, этот код не полностью протестирован)

CKEDITOR.dom.window = (function(window) {
    if ( CKEDITOR.status == 'loaded' ) {
        // The API can now be fully used.
        return window;
    } else {
        return (async function() {
            return await function() {
                return new Promise(resolve => {
                    CKEDITOR.on( 'load', () => {
                        resolve(window);
                    });
                });
            };
        })();

        CKEDITOR.loadFullCore && CKEDITOR.loadFullCore();
    }
})(CKEDITOR.dom.window);

Прежде чем совершать какие-либо действия с CKEDITOR, лучше проверить, существует ли он И существует ли целевой ввод. Утвержденный ответ почти такой же - уничтожение экземпляра, не включенного в список, во входных данных DOM.

      let inputId = "some_uniq_id";
if (
   CKEDITOR.instances[inputId]
   && !document.contains(CKEDITOR.instances[inputId].element.$)
) {
  CKEDITOR.instances[inputId].destroy();
}
if (!CKEDITOR.instances[inputId]) {
  CKEDITOR.replace(inputId, {toolbar: []});
}
CKEDITOR.instances[inputId].setData('<p>Some nice text =*</p>')
// setData as example in my case

Вы можете попробовать

CKEditor.destroy();

Измените функцию f.$.onload внутри ckeditor.js на следующую

 f.$.onload=function(){var toutMs =5000;
    if(CKEDITOR.document.getHead().$.childElementCount > 6)
    {
    toutMs=0;
      }
    setTimeout(function(){
    A(b,!0)
     },toutMs)
     }
Другие вопросы по тегам