更改css链接并等到新css加载

时间:2012-09-04 22:32:08

标签: javascript jquery css

我想知道是否可以更改已加载文档的样式表链接,然后等到新css加载,然后运行相应的js代码

感谢任何建议

6 个答案:

答案 0 :(得分:5)

HTML:

<link id="mystylesheet" href="/path/to/css.css" />

代码:

$("#mystylesheet").load(function(){
  //Your javascript
}).attr("href", "/new/path/to/css.css");

这将替换您当前的CSS,并在获取新的CSS文件后执行.load()处理程序中的任何代码。

答案 1 :(得分:3)

@ahren几乎是正确的。但是,当css文件通过动态更改链接元素上的href完成加载时使用回调似乎不适用于大多数移动设备。

而是尝试使用load直接将样式注入样式元素..最终得到大多数现代浏览器的支持,包括移动浏览器

更新以包括对IE 8的支持;注意这需要你在你的css中注入一个虚拟规则以验证何时加载了css(在这种情况下使用body {ready:true;})

css

body {ready:true;}
...

HTML

<style id="your-style-element"></style>

的javascript

if (document.createStyleSheet) {

    //Wait for style to be loaded
    var wait = setInterval(function(){
      //Check for the style to be applied to the body
      if($('body').css('ready') === 'true') {
        clearInterval(wait);

        //CSS ready
      }
    }, 300);

    document.createStyleSheet(url);
} else {
    //Dynamically load the css for this doc
    $("#your-style-element").load(url,function(){

       //CSS ready
    });
}

答案 2 :(得分:0)

试试这个男人:http://forum.jquery.com/topic/loading-stylesheets-on-the-fly

或:http://www.rickardnilsson.net/post/2008/08/02/Applying-stylesheets-dynamically-with-jQuery.aspx Changing a stylesheet using jQuery

希望它适合原因:)

<强>代码

var link = $("<link>");
link.attr({
        type: 'text/css',
        rel: 'stylesheet',
        href: <your CSS file url>
});
$("head").append( link ); 

答案 3 :(得分:0)

你可以试试plug-in我为此案专门写的。

不确定.load()的{​​{1}}方法,它似乎不是跨浏览器的。只有IE支持链接元素上的jQuery事件,afaik。

答案 4 :(得分:0)

这是我写的一篇关于47 LOC的完美作品:

https://gist.github.com/aleclarson/ac6456c75edae9fe9d9b6938142a065b

它使用rm -rf ~/Library/Containers/com.docker.docker/Data/*检查每个帧上的requestAnimationFrame,直到每个给定的URL片段都已加载。

示例:

document.styleSheets

纯粹的javascript!

答案 5 :(得分:0)

https://stackoverflow.com/a/35644406/20774,TeaCoder对这个问题有很好的答案。

基本上使用元素onload方法,并在样式加载后放置要发生的逻辑。

这是使用内置DOM功能执行此操作的好方法,但回调语法有点尴尬。这是我用Promises做到的方式:

const createOnLoadPromise = (htmlElement) =>
  new Promise((resolve) => {
    htmlElement.onload = resolve;
  });
const link1 = document.head.appendChild(createStyleLink(href1));
const link2 = document.head.appendChild(createStyleLink(href2));
await Promise.all([
  createOnLoadPromise(link1),
  createOnLoadPromise(link2),
]);
// do whatever you need to do after the await