greasemonkey - 加载 html 和 css 时的 运行 脚本
greasemonkey - run script when html and css is loaded
正如标题所说,我想等到 html 被解析,所有样式表都加载完毕,因为我需要使用 currentsyle
。但是,我不想等待图像。所以我不能使用 load
事件,因为它等待图像。而且我不能使用 DOMContentLoaded
事件,因为它不等待样式表。我也不能使用 document.body.appendChild
在文档末尾添加脚本标记,因为此脚本是 运行 假设页面上的 javascript 已禁用。
真的没有事件可以等待样式吗?
GM 脚本有三个可能的 run-at
值 - 相应的 document.readyState 在括号中
- 文档开始(之前
document.readyState === 'loading'
)
- 文件结束(
document.readyState === 'ineractive'
)
- 文档闲置 (
document.readyState === 'complete'
)
这些是您的脚本唯一可用的注入点
在 start/end - 还没有加载任何外部资源,所以对于你想要的东西来说太早了
空闲时,所有外部资源都已加载,太晚了,你想要什么
好的,这些你都知道,但我要为其他未来的读者添加它
如果您在文档末尾加载脚本,则可以向所有 <link rel="stylesheet"
添加 load
个侦听器,例如
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
});
正如标题所说,我想等到 html 被解析,所有样式表都加载完毕,因为我需要使用 currentsyle
。但是,我不想等待图像。所以我不能使用 load
事件,因为它等待图像。而且我不能使用 DOMContentLoaded
事件,因为它不等待样式表。我也不能使用 document.body.appendChild
在文档末尾添加脚本标记,因为此脚本是 运行 假设页面上的 javascript 已禁用。
真的没有事件可以等待样式吗?
GM 脚本有三个可能的 run-at
值 - 相应的 document.readyState 在括号中
- 文档开始(之前
document.readyState === 'loading'
) - 文件结束(
document.readyState === 'ineractive'
) - 文档闲置 (
document.readyState === 'complete'
)
这些是您的脚本唯一可用的注入点
在 start/end - 还没有加载任何外部资源,所以对于你想要的东西来说太早了
空闲时,所有外部资源都已加载,太晚了,你想要什么
好的,这些你都知道,但我要为其他未来的读者添加它
如果您在文档末尾加载脚本,则可以向所有 <link rel="stylesheet"
添加 load
个侦听器,例如
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
});