Почему CKEditor4 DOM не переходит в состояние готовности "завершено"? - PullRequest
0 голосов
/ 09 января 2019

Проблема: Когда 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?

...