greasemonkey - запускать скрипт при загрузке html и css - PullRequest
0 голосов
/ 23 октября 2018

Как видно из заголовка, я хочу подождать, пока html не будет проанализирован, и все таблицы стилей загружены, потому что мне нужно использовать currentsyle.Однако я не хочу ждать изображений.Поэтому я не могу использовать событие load, так как оно ожидает изображения.И я не могу использовать событие DOMContentLoaded, так как оно не ждет таблиц стилей.Я также не могу использовать document.body.appendChild для добавления тега сценария в конце документа, потому что этот сценарий запускается в предположении, что на странице отключен JavaScript.

Серьезно ли нет событий для ожидания в стилях?

1 Ответ

0 голосов
/ 23 октября 2018

Существует три возможных run-at значения для сценариев GM - с соответствующим document.readyState в скобках

  • document-start ( до document.readyState === 'loading')
  • document-end (document.readyState === 'ineractive')
  • document-idle (document.readyState === 'complete')

Это единственные доступные точки внедрения для вашего скрипта

вначало / конец - внешние ресурсы еще не будут загружены, поэтому слишком рано для того, что вы хотите

на холостом ходу, все внешние ресурсы загружены, так что слишком поздно для того, что вы хотите

ОК, вызнаю все это, но я добавляю это для других будущих читателей

если вы загрузите свой скрипт в конце документа, вы можете добавить load слушателей ко всем <link rel="stylesheet", как

Promise.all(Array.from(document.querySelectorAll('link[rel="stylesheet"]'), ss => new Promise(resolve => {
    const href = ss.href;
    const fulfill = status => resolve({href, status});
    setTimeout(fulfill, 5000, 'timeout');
    ss.addEventListener('load', () => resolve('load'));
    ss.addEventListener('error', () => resolve('error')); // yes, resolve, because we just want to wait until all stylesheets are done with, errors shouldn't stop us
}))).then((results) => {
    // results is an array of {href:'some url', status: 'load|error|timeout'}
    // at this point stylesheets have finished loading
});
...