在 CSS 加载时
来源: https ://stackoverflow.com/a/12570580/1292652
向要检查的 CSS 文件添加唯一的参考样式,如下所示:
#ensure-cssload-0 {
display: none;
}
然后,使用 JS 函数 ,cssLoad()
反复检查 CSS 是否已下载(不确定这是否与实际绘制/渲染 CSS 时有显着差异):
var onCssLoad = function (options, callback) {
var body = $("body");
var div = document.createElement(constants.TAG_DIV);
for (var key in options) {
if (options.hasOwnProperty(key)) {
if (key.toLowerCase() === "css") {
continue;
}
div[key] = options[key];
}
}
var css = options.css;
if (css) {
body.appendChild(div);
var handle = -1;
handle = window.setInterval(function () {
var match = true;
for (var key in css) {
if (css.hasOwnProperty(key)) {
match = match && utils.getStyle(div, key) === css[key];
}
}
if (match === true) {
window.clearTimeout(handle);
body.removeChild(div);
callback();
}
}, 100);
}
}
您可以将其用作:
onCssLoad({
"id": <insert element CSS applies to>,
css: <insert sample CSS styles>
}, function () {
console.log("CSS loaded, you can show the slideshow now :)");
});
关于 CSS 计算
来源: http ://atomicrobotdesign.com/blog/javascript/get-the-style-property-of-an-element-using-javascript/
先前的解决方案仅告诉 CSS 文件是否已被'downloaded',而在您的问题中您提到您需要知道元素的样式何时已被'computed'或'rendered'或'painted'。我希望这可以解决这个问题。
向要检查的 CSS 文件添加唯一的参考样式,如下所示:
#ensure-cssload-0 {
ignored-property: 'computed';
}
现在,使用getPropertyValue
andgetComputedStyle
来检查 CSS:
function getStyle(elem, prop) {
return window.getComputedStyle(elem, null).getPropertyValue(prop);
}
现在,只需使用while
带有回调的循环:
function checkStyle(elem, prop, callback) {
while ( getStyle(elem, prop) !== 'computed' ) {
// see explanation below
}
callback()
}
由于JavaScript 没有pass
语句(就像在 Python 中一样),我们使用空代码块。
如果您想检索应用于元素的所有CSS 样式(警告:这也会显示继承的样式),请查看这个 SO answer。
避免 while() 循环
通常不建议使用 while 循环检查任何内容,因为它挂起浏览器不让 JavaScript 线程做任何其他事情(现在所有的浏览器都是多线程的,参见这个漫画)。
这是Chuck 建议的,这个解决方案要好得多:
function checkStyle(elem, prop, callback) {
if ( getStyle(elem, prop) !== 'computed' ) {
// see explanation below
window.setTimeout( function() {checkStyle(elem, prop, callback);}, 100 )
} else {
callback()
}
}
这要好得多。现在该函数每 100 毫秒异步检查一次(您可以根据需要更改此值)。在设置超时时包装函数是必要的,因为setTimeout()
还不允许传递任何参数。
希望这有帮助。有关更多链接,请参阅这篇文章的源代码...