Проблема: Когда CKEditor 4 переключается из HTML обратно в режим WYSIWYG, FireFox остается в состоянии готовности DOM interactive
и никогда не переходит в complete
. Мне нужно вставить правила CSS, когда DOM complete
. Они успешно добавляются при загрузке страницы, но теряются при переключении CKEditor из режима HTML в режим WYSIWYG.
Затрагиваемый браузер FireFox 64.
Не влияет Chrome 71.
История: CKEditor 4 загружает файл HTML, и мне нужно вставить управляемые данными правила CSS для стилевых разделов содержимого CKEditor. Я ограничен в изменении содержимого файла, поэтому я генерирую и добавляю правила CSS в таблицы стилей в памяти, а не просто добавляю тег стиля в документ.
var stylesheet = $.grep(doc.$.styleSheets, function (e) {
return (e.href && e.href.indexOf("ck_contents.css") > 0);
});
if (stylesheet && stylesheet.length > 0) {
var rules = getRuleInfo();
$.each(rules, function (i, e) {
stylesheet[0].insertRule(e, CSSRuleList.length);
});
}
В Chrome событие contentDom
срабатывает после того, как состояние готовности DOM равно complete
, но в FireFox событие срабатывает, когда состояние готовности все еще было interactive
. Вставка CSSrules в то время как interactive
выдает ошибку Javascript.
Так что, если DOM не готов, мы добавим слушателя, который будет ждать его. Код немного избыточен, но он работает.
editor.on('contentDom', function () {
if (editor.document.$.readyState === "complete") {
// This is always Chrome
addCSSStlyes(editor.document);
} else {
// This is always FireFox
editor.document.$.onreadystatechange = function () {
if (editor.document.$.readyState === "complete") {
addCSSStlyes(editor.document);
}
};
}
});
Все хорошо вставляет правила CSS при загрузке. Они корректно отображаются при загрузке страницы / открытии документа. Затем, если используется команда «просмотреть исходный код» CKEditor, редактор переходит в режим HTML и затем возвращается в WYSIWYG, событие contentCom
срабатывает, и, как и в FireFox, состояние готовности равно interactive
. Прослушиватель событий настроен, но состояние готовности никогда не переходит на complete
, поэтому стили никогда не вставляются повторно, поэтому стили теряются.
Как я могу убедиться, что состояние готовности FireFox переходит в complete
?