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 ответов
- У меня есть список статей.
- каждый раз, когда я нажимаю на какую-либо статью, должен быть открыт "диалог / модал".
- в таком диалоге или модале был элемент ckeditor для содержания моей статьи.
- когда я нажал на первый, он работал как шарм.
- проблема была после нажатия на 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
Измените функцию f.$.onload внутри ckeditor.js на следующую
f.$.onload=function(){var toutMs =5000;
if(CKEDITOR.document.getHead().$.childElementCount > 6)
{
toutMs=0;
}
setTimeout(function(){
A(b,!0)
},toutMs)
}