【问题标题】:Load StyleSheet dynamically with Callback function使用回调函数动态加载样式表
【发布时间】:2012-02-28 05:59:05
【问题描述】:

我有这个动态加载 CSS 文件的简短 JavaScript 函数。但是我还不擅长 JavaScript,所以任何人都可以告诉我如何在成功加载 CSS 文件后创建回调函数...

function loadStyleSheet(url){
    if(document.createStyleSheet) {
        try {document.createStyleSheet(url);} catch (e) { }
    }
    else{
        var css;
        css         = document.createElement('link');
        css.rel     = 'stylesheet';
        css.type    = 'text/css';
        css.media   = "all";
        css.href    = url;
        document.getElementsByTagName("head")[0].appendChild(css);
    }
}

附:如果您知道我如何知道 CSS 文件的加载是否失败。好吧,我会更加感谢你的^_^

【问题讨论】:

  • 原始代码来自这里stackoverflow.com/questions/805384/…
  • 我已经在 IE7、8、9 FF、Safari、Opera 和 Chrome 上测试过这个代码运行良好......
  • CSS 是从同一个域还是从其他域加载的?
  • 域外...

标签: javascript css


【解决方案1】:

我不确定是否有防弹方法来检查样式表是否已加载。这主要取决于 CSS 是从同一个域加载还是从另一个域加载。

我用来检查 CSS 是否已加载的技巧是在 CSS 中添加(或使用)已知规则,如下所示:

  • 示例规则:.foobar { display: none; }
  • 在我的文档中添加一个元素:<span class="foobar"></span>
  • 使用您使用的方法加载 CSS
  • 使用window.setTimeout() 定期轮询文档并检查span.foobar 是否仍然可见。当它被隐藏时,这意味着 CSS 已加载

【讨论】:

  • 我想我会创建一个隐藏的 div,它会被 CSS 文件操作。如果隐藏的 div 被操纵...然后 CSS 被加载
  • 我的观点完全正确。对于外部域 CSS,AJAX 不是一个选项; document.styleSheets[n].cssRules.length > 0 也不是一个选项。
  • 希望这可以上升到顶部 :) 这是我在这里看到的唯一真正解决原始问题的答案
【解决方案2】:

将回调函数作为参数传递给函数,然后在加载样式表后调用它。

例如:

function myFunc() {
  alert("Hello, World");
}

loadStyleSheet("link/to/stylesheet.css", myFunc);

function loadStyleSheet(url, callback){
    if(document.createStyleSheet) {
        try {document.createStyleSheet(url);} catch (e) { }
    }
    else{
        var css;
        css         = document.createElement('link');
        css.rel     = 'stylesheet';
        css.type    = 'text/css';
        css.media   = "all";
        css.href    = url;
        document.getElementsByTagName("head")[0].appendChild(css);
    }
    callback();
}

编辑

如果你想测试它是否正确加载了样式表,你必须使用AJAX

【讨论】:

  • 如何检测css文件是否加载成功?我知道这段代码可以工作......但是如果超时并且没有加载css文件怎么办
  • 您必须为此使用 AJAX。我建议学习 jQuery,因为它更容易理解和实现。
  • 有没有关于使用带有回调函数的 AJAX 加载 CSS 文件的链接?
  • 不是我的头顶。我相信你可以很容易地用谷歌找到类似的东西。正如我所说,使用 jQuery 会容易得多。
  • 你可以添加一个负载处理程序到css而不用去AJAX;问题仍然是 IE 专有的东西
【解决方案3】:

我想我找到了问题的答案^_^ http://yepnopejs.com/

谢谢大家的帮助^_^

【讨论】:

    【解决方案4】:

    我认为最简单的方法是在加载时将标记附加到头部

    $('<link rel="stylesheet" href="link.css" type="text/css" />').appendTo("head")
    .each(function() { //little trick to create the callback function
        // I am the callback
    });
    

    P.S:它是一个 jQuery 解决方案。我没有注意到 JS & CSS 标签,但它仍然是一个很好的解决方案

    【讨论】:

    • 这不是意味着“加载”,而是附加到 DOM 上吗?我认为最初的问题是指 CSS 已加载和解析,而不是您创建了 &lt;link /&gt; 元素
    猜你喜欢
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2011-05-26
    • 1970-01-01
    相关资源
    最近更新 更多