如何使用jQuery异步加载CSS?

aemubtdh  于 2023-10-17  发布在  jQuery
关注(0)|答案(9)|浏览(112)

我想使用jQuery异步加载文档的CSS。
我找到了这个示例,但这似乎在IE中不起作用:

<script type="text/javascript" src="/inc/body/jquery/js/jquery-1.4.4.min.js"></script>
<script type="text/javascript">
    $(function(){
        $('<link>', {
            rel: 'stylesheet',
            type: 'text/css',
            href: '/inc/body/jquery/css/start/jquery-ui-1.8.10.custom.css'
        }).appendTo('head');
        $.getScript("/inc/body/jquery/js/jquery-ui-1.8.10.custom.min.js", function(){
        });
    });
</script>

基本上我想加载jQuery UI后,所有其他数据,图像,样式等加载到页面。
$.getScript非常适合JS文件。唯一的问题是IE中的CSS。
你知道更好的解决办法吗?

qltillow

qltillow1#

这里有一个异步样式表加载的方法,不会阻止页面呈现,对我来说很有效:
https://github.com/filamentgroup/loadCSS/blob/master/loadCSS.js
基于lonesomeday的答案,上面链接的代码的简化示例

var stylesheet = document.createElement('link');
stylesheet.href = '/inc/body/jquery/css/start/jquery-ui-1.8.10.custom.css';
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'}
document.getElementsByTagName('head')[0].appendChild(stylesheet);
ybzsozfc

ybzsozfc2#

安全的方法是老方法...

var stylesheet = document.createElement('link');
stylesheet.href = '/inc/body/jquery/css/start/jquery-ui-1.8.10.custom.css';
stylesheet.rel = 'stylesheet';
stylesheet.type = 'text/css';
document.getElementsByTagName('head')[0].appendChild(stylesheet);
5t7ly7z5

5t7ly7z53#

在IE中应该这样做:

$("head").append("<link rel='stylesheet' type='text/css' href='/inc/body/jquery/css/start/jquery-ui-1.8.10.custom.css' />");
iyzzxitl

iyzzxitl4#

正如在JavaScript文档中提到的,棘手的部分在于加载CSS:

function loadCss(url) {
    var link = document.createElement("link");
    link.type = "text/css";
    link.rel = "stylesheet";
    link.href = url;
    document.getElementsByTagName("head")[0].appendChild(link);
}

但是在知道CSS何时/是否已经成功加载时,就像你的用例“我想在所有其他数据,图像,样式等加载之后加载jQuery UI**”一样。
理想情况下,JavaScript可以加载CSS文件作为依赖项。但是,当CSS文件被加载时,特别是在Gecko/Firefox中,当文件从另一个域加载时,会出现问题。一些历史可以在这个Dojo门票中找到。
知道文件何时加载是很重要的,因为您可能只想在样式表加载后获取DOM元素的维度。
有些人已经实现了一种方法,他们寻找一个众所周知的样式应用于特定的HTML元素,以了解是否加载了样式表。由于该解决方案的特殊性,它并不适合使用WIREJS。知道link元素何时加载了引用的文件是最可靠的解决方案。
由于知道文件何时加载并不可靠,因此在JavaScript加载中显式支持CSS文件没有意义,因为它会导致由于浏览器行为而导致的错误报告。

8oomwypt

8oomwypt5#

根据Dynamically loading css stylesheet doesn't work on IE
你需要最后设置href属性,并且只有在链接元素被附加到头部之后。

$("<link>")
  .appendTo('head')
  .attr({type : 'text/css', rel : 'stylesheet'})
  .attr('href', '/css/your_css_file.css');
5lhxktic

5lhxktic6#

jQuery(function(){

jQuery('head').append('<link href="/inc/body/jquery/css/start/jquery-ui-1.8.10.custom.css" rel="stylesheet" type="text/css" />')

});
pgccezyw

pgccezyw7#

$.get("path.to.css",function(data){
    $("head").append("<style>"+data+"</style>");
});
7rtdyuoh

7rtdyuoh8#

这里没有一个解决方案在加载CSS文件时不阻塞页面呈现--这通常是“异步”的意思。(如果浏览器正在等待某个东西并阻止用户与页面交互,那么这种情况就定义为同步。)
同步和异步加载的例子可以在这里找到:
http://ajh.us/async-css
我发现使用setTimeout延迟加载似乎有所帮助。

8ljdwjyq

8ljdwjyq9#

另一个几乎没有内联JavaScript的选项:

<link
    rel="preload"
    href="/inc/body/jquery/css/start/jquery-ui-1.8.10.custom.css"
    as="style"
    onload="this.onload = null; this.rel = 'stylesheet';"/>

浏览器将不阻塞地加载文件,然后在load上将其切换到正确的rel=stylesheet,这将解释CSS文件。

相关问题