如何使用 jQuery 异步加载 CSS?

Posted

技术标签:

【中文标题】如何使用 jQuery 异步加载 CSS?【英文标题】:How to asynchronously load CSS using jQuery? 【发布时间】:2011-07-08 09:11:02 【问题描述】:

我想使用 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。

你知道更好的解决方案吗?

【问题讨论】:

如果你把它做成$('&lt;link/&gt;'...,它会起作用吗? IE。添加正斜杠。 我不确定您所说的异步是什么意思...您可能是指动态的吗? 【参考方案1】:

这应该在 IE 中工作:

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

【讨论】:

反之亦然:$('&lt;link .../&gt;').appendTo($('head'))。这将允许您链接 link 元素,而不是 head 元素,如果您想在将其附加到 &lt;head&gt; 后对其执行其他操作。 据此 (***.com/questions/5085228/…),追加不会异步执行。 @ElHaix 确实如此,但我认为 OP 误解了“异步”这个词,真正的意思是“动态”。 @PeterOlson - 查看yterium.net/jQl-an-asynchronous-jQuery-Loader - 你真的可以加载你的 CSS 异步吗? 对,这不是异步的。【参考方案2】:

安全的方式是旧的方式......

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);

【讨论】:

谢谢,但我更喜欢在 jQuery 中执行此操作。 为什么这比 jQuery 更可取?你提到这是“安全”的方式。是什么使它比公认的答案更安全(当然假设存在 jQuery)? RequireJS.org 文档专门参考了这种方法:requirejs.org/docs/faq-advanced.html#css 根据经验:纯 JS 总是更好,但我不明白这个解决方案如何解决不知道 CSS 文件何时完成加载的问题。 让我告诉你为什么这种方法比 jQuery 更有效...因为如果你通过 jQuery 加载它,你将不得不等到 jQuery 被加载,但使用这种方法你不需要等待jQuery,你可以并行加载jQuery、CSS和其他脚本【参考方案3】:
jQuery(function()

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

);

【讨论】:

【参考方案4】:

正如RequireJS docs 中提到的,棘手的部分在于加载 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”。

理想情况下,RequireJS 可以加载 CSS 文件作为依赖项。然而,有 是知道何时加载 CSS 文件的问题,尤其是在 从另一个域加载文件时的 Gecko/Firefox。一些 历史可以在这张道场门票中找到。

知道文件何时加载很重要,因为您可能只想 获取样式表后的 DOM 元素的尺寸 已加载。

有些人实施了一种寻找井的方法 要应用于特定 HTML 元素的已知样式,以了解是否有 样式表已加载。由于该解决方案的特殊性,它是 不适合 RequireJS 的东西。知道什么时候 链接元素已加载引用的文件将是最健壮的 解决方案。

由于知道文件何时加载是不可靠的,所以它不 在 RequireJS 加载中显式支持 CSS 文件是有意义的,因为 由于浏览器行为,它会导致错误报告。

【讨论】:

【参考方案5】:

根据Dynamically loading css stylesheet doesn't work on IE:

您需要最后设置 href attr 并且仅在将链接 elem 附加到头部之后。

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

【讨论】:

【参考方案6】:
$.get("path.to.css",function(data)
    $("head").append("<style>"+data+"</style>");
);

【讨论】:

警告:如果您的 css 文件是跨域托管的(浏览器限制),这可能不起作用。 ^ 对于每个 http 请求都是如此【参考方案7】:

这里没有一个解决方案实际上是在不阻塞页面渲染的情况下加载 CSS 文件——这通常是“异步”的意思。 (如果浏览器正在等待某事并阻止用户与页面交互,则根据定义,这种情况是同步的。)

同步和异步加载的例子可以在这里找到:

http://ajh.us/async-css

我发现使用setTimeout 来延迟加载似乎有帮助。

【讨论】:

【参考方案8】:

这是一种异步样式表加载方法,它不会阻止页面呈现,它对我有用:

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);

【讨论】:

!!这对我来说最有效(考虑到 pageSpeed 洞察) 像魅力一样工作!

以上是关于如何使用 jQuery 异步加载 CSS?的主要内容,如果未能解决你的问题,请参考以下文章

如何异步加载 CSS - WordPress

如何在rails中异步加载部分页面

使用 jQuery 异步加载图像

php 如何在WordPress中异步加载CSS文件(使用Scott Jehl的“loadCSS”)

使用回退异步加载 jquery 核心

如何异步加载和显示数据