Javascript ожидает применения всех стилей элементов

Мне нужно разрешить (т.е. «применить», а не просто загрузить в память) все стили для всех элементов веб-страницы HTML с помощью некоторого javascript/jquery. Стили могут быть встроенными в тег стиля элемента, встроенными в стили страницы или внешними из таблицы стилей.

Я видел примеры разрешения одного элемента или даже одного стиля с помощью window.getComputedStyle с setTimeout, но мне нужно убедиться, что разрешены все элементы (а не только один или даже группа).

(Обратите внимание, что после загрузки страницы у меня запущено много javascript, который генерирует дополнительный html (со стилями), поэтому document.ready и window.load уже запущены к моменту завершения javascript страницы)

(Обратите внимание, что это не просто вопрос ожидания загрузки файла таблицы стилей — это скорее вопрос ожидания применения стилей из всех источников)

Это возможно ?

ОБНОВИТЬ

Основываясь на примере @Kaiido, я пришел к следующему (он использует JQuery Deferred, а не Javascript Promise - это потому, что я больше знаком с Deferred, и мне нужно, чтобы он соответствовал внутренним стандартам JQuery)

<style>
    .myStyle {...}
    .myStyle2 {...}
</style>

var cssIsAppliedPromise = function(){
    var trigger = document.createElement('style');
    trigger.innerHTML = 'body{opacity:1;}';
    var waiter = document.createElement('style');
    waiter.innerHTML = 'body{transition : opacity 0.1s linear; opacity:.9}';
    var deferred = $.Deferred();
    // will trigger only when all styles are applied
    function isDone(evt) {
        // some cleanup
        waiter.parentNode && document.head.removeChild(waiter);
        trigger.parentNode && document.head.removeChild(trigger);
        // resolve the promise
        deferred.resolve();
    }
    document.body.addEventListener('transitionend', isDone, {
        once: true
    });
    document.head.appendChild(waiter);
    // append it only when all resources are fetched
    window.onload(function() {
        document.body.offsetWidth; // trigger a reflow
        document.head.appendChild(trigger);
    });
    return deferred.promise();
}
cssIsAppliedPromise.done(function(){
        //logic after styles applied
});

Хотя это, кажется, работает, я не уверен, что это так - трудно сказать - проблема, которая у меня есть, все еще существует. Как я могу быть уверен, что приведенное выше действительно применяет стили, прежде чем переходить к «логике после применения стилей»?


person TerrorBight    schedule 07.09.2017    source источник
comment
Возможный дубликат jQuery Append CSS File и Подождать, пока стили будут применены без setInterval?   -  person Kaiido    schedule 07.09.2017
comment
Спасибо, Кайидо - предоставленная ссылка больше касается ожидания загрузки файла (ов) таблицы стилей - я спрашиваю больше об ожидании применения стилей (из всех источников - тег стиля элемента, встроенные стили, внешние стили) ко всем html-элементам   -  person TerrorBight    schedule 07.09.2017
comment
событие transitionend сделает это. Смотрите предоставленную ссылку   -  person Alex Slipknot    schedule 07.09.2017
comment
Из связанного вопроса: Это работает, но у меня есть функция, которую нужно запустить после применения CSS   -  person Kaiido    schedule 07.09.2017
comment
Спасибо @Kaiido / AlexSlipknot. Мне не совсем понятно, что вы предлагаете. У меня есть веб-страница со встроенным стилем со многими классами, то есть внутри ‹style..›...‹/style› и множество элементов HTML, которые относятся к этим классам, а также имеют свои собственные стили (например, ...‹div class=... style=...›...). Как дождаться (я полагаю, через событие перехода), пока не будут применены все эти стили   -  person TerrorBight    schedule 07.09.2017
comment
В вашем случае вам даже не нужно, чтобы таблицы стилей находились во внешних файлах, вы можете просто добавить их прямо в голову. Вот переписывание предыдущего ответа в виде функции js: jsfiddle.net/5dup24nz   -  person Kaiido    schedule 07.09.2017
comment
Обратите внимание, что после загрузки страницы у меня выполняется много javascript, который генерирует дополнительный html У вас есть скрипт, который может запускаться в зависимости от взаимодействия с пользователем? Запускается ли этот сценарий позже, потому что это запланировано? Что именно делает этот скрипт? Какова цель вашего загадочного кода? У вас есть код?   -  person zer00ne    schedule 07.09.2017
comment
Я добавил обновление к исходному сообщению - большая часть Javascript на самом деле является кодом DustJS (т.е. сгенерирован из шаблона) - это означает, что жизненный цикл страницы не совсем типичен, поскольку затем запускается код (который генерирует гораздо больше html со стилями, которые нужно применить). Существует также дополнительная сложность в том, что в конечном счете пытаются достичь того, что код помещается в ExpertPDF (генератор PDF) — все работает хорошо, за исключением этого последнего пограничного случая, когда PDF создается до того, как он успеет применить свое значение. стили для отдельных элементов   -  person TerrorBight    schedule 08.09.2017
comment
Это все еще очень неясно. Является ли загрузка содержимого этого Dust code (кстати, что такое Dust code?) ранжированным a синхронно? О чем вы говорите в ExpertPDF? [Библиотека .net](www.expertpdf.net)? Мой метод будет работать только для элементов, которые добавляются как минимум до окончания события onload, а не для тех, которые добавляются асинхронно после этого события. И в целом, единственный способ сказать вам, что вы предоставите нам минимальный воспроизводимый пример .   -  person Kaiido    schedule 09.09.2017