javascript - 使用 vanilla javascript 回调和延迟加载 css

标签 javascript css

我想延迟加载一个CSS文件,然后让JavaScript修改页面在加载CSS之后。为此,我使用 this方法,如下所示:

lazyLoadCSS = function (pathToStyleSheet, options, callback) {
    var stylesheet = document.createElement('link');
    stylesheet.href = pathToStyleSheet;
    stylesheet.rel = 'stylesheet';
    stylesheet.type = 'text/css';
    // temporarily set media to something inapplicable to ensure 
    // it'll fetch without blocking render
    stylesheet.media = 'only x';
    // set the media back when the stylesheet loads
    stylesheet.onload = function() {
        stylesheet.media = 'all';

        // here be callbacks...
        callback();
    };
    document.getElementsByTagName('head')[0].appendChild(stylesheet);
};

所以,这个想法是,javascript 获取 CSS,但将其作为“仅 x”走私,因此浏览器认为在渲染页面的其余部分之前不需要等待文件,这就是重点。这个approach似乎非常标准,上面的代码确实可以工作......大部分。

唯一的问题是回调。它发生在 CSS 加载之后、样式应用到文档之前。

如果我在回调上放置一个计时器,如下所示:

window.setTimeout(function(){
    callback();
}, 2000);

然后一切都按照应有的方式运行(只是慢)。

问题是,在运行 callback() 之前,如何才能不仅等待 CSS 加载,而且应用

最佳答案

根据上面的一些评论,这是我想出的并且效果很好(尽管尚未经过彻底测试):

function waitForStylesToApply(cycleNumber, canary, callback){
    if(cycleNumber < 100){
        window.setTimeout(function(){
            var computedValue = window
                .getComputedStyle(window.document.body, null)
                .getPropertyValue('max-width');
            if(computedValue !== canary){
                if(typeof callback === 'function'){
                    console.log('done in ' + cycleNumber + ' cycles');
                    callback();                                            
                }
            }
            else {
                waitForStylesToApply(cycleNumber++, canary, callback);                        
            }
        }, 10);    
    }
}

检查 <body> 的计算样式一遍又一遍,直到改变。然后它执行回调。到目前为止,代码从未需要循环多次,因此等待时间是无限小的。

甚至延迟10太多了。代码将延迟 0 运行。并且仍然只循环一次。

编辑:使用此函数代替简单地使用 callback()在上面的例子中。

关于javascript - 使用 vanilla javascript 回调和延迟加载 css,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46496717/

相关文章:

javascript - 如何在 JQuery 中更改日期变量的颜色?

Javascript对象声明问题

javascript - 未捕获的类型错误 : Cannot set properties of undefined (setting 'display' )

javascript - 列表的倒序

css - 浏览器/网络邮件客户端中的默认打印样式

ASP.NET Gridview - 如何使除标题行以外的所有行都具有悬停效果?

javascript - 如何在指令中获取 ng-class 值

javascript - 在 HTML5 Canvas 上绘制旋转文本

css - 使用子/父技术应用 CSS

javascript - TypeError : $(. ..).SetHeight 不是函数