在jQuery中加载外部css文件,如脚本,在


69

有没有一种方法可以加载外部CSS文件,例如我们使用.getScript方法加载JS文件,也可以使用.getScript中的回调函数

$("<link/>", {
   rel: "stylesheet",
   type: "text/css",
   href: "/styles/yourcss.css"
}).appendTo("head");

这在FireFox和类似版本中有效,但在IE中无效。

Answers:


113

在jQuery 1.4中:

$("<link/>", {
   rel: "stylesheet",
   type: "text/css",
   href: "/styles/yourcss.css"
}).appendTo("head");

http://api.jquery.com/jQuery/#jQuery2


7
好的,但是一旦CSS文件加载,如何使用回调函数如.getScript()
Starx 2010年

1
对我来说,它在IE8中不起作用。这是一个有效的解决方案stackoverflow.com/questions/805384/…(由用户“ user406905”提供)
Vilius Paulauskas,2012年


2
这似乎是问题代码的精确复制和粘贴,该问题是在询问是否存在与jQuery.getScript()等效的答案no
路加福音O'Brien

19

基于响应的快速功能。

loadCSS = function(href) {

  var cssLink = $("<link>");
  $("head").append(cssLink); //IE hack: append before setting href

  cssLink.attr({
    rel:  "stylesheet",
    type: "text/css",
    href: href
  });

};

用法:

loadCSS("/css/file.css");

谢谢...我将您的代码与MVC 4捆绑包结合在一起,它可以正常工作!
2013年

请参阅我的答案以获取添加的回调,而不会触发CSS资源上的其他请求。我认为此IE hack与2019
。– Willster

17
$("head").append("<link>");
var css = $("head").children(":last");
css.attr({
      rel:  "stylesheet",
      type: "text/css",
      href: "address_of_your_css"
});

好的,但是一旦加载CSS文件,如何使用回调函数(如.getScript())
Starx 2010年

1
@Starx请编辑您的原始问题以准确反映您的需求-不仅动态地加载外部CSS文件,还需要回调。
劳尔·阿格拉特

Yay for IE hacks。您的第二行可能是:var css = $('head > :last')是吗?
朱利安(Julian)2012年

我已将此脚本改编为可与jquery 1.12.4一起使用,没有任何问题,仅供参考。
j4v1

4
使用appendTo将更加容易和直观,例如:$("<link>").attr({ rel: "stylesheet", type: "text/css", href: "address_of_your_css" }).appendTo("head");
oriadam

10

我认为OP想要做的是异步加载样式表并添加它。这对于Chrome 22,FF 16和IE 8中的我来说适用于存储为文本的CSS规则集:

$.ajax({
    url: href,
    dataType: 'text',
    success: function(data) {
        $('<style type="text/css">\n' + data + '</style>').appendTo("head");                    
    }                  
});

就我而言,有时我还希望加载的CSS替换以前以这种方式加载的CSS。为此,我在开头添加了一个注释,说“ / *标记此ID = 102 * /”,然后可以执行以下操作:

// Remove old style
$("head").children().each(function(index, ele) {
    if (ele.innerHTML && ele.innerHTML.substring(0, 30).match(/\/\* Flag this ID=102 \*\//)) {
        $(ele).remove();
        return false;    // Stop iterating since we removed something
    }
});

通过将外部资源(css)下载为文本并将其转储到<Style>标记内,您将失去浏览器的缓存功能,因为该浏览器使用css URL作为缓存键进行缓存。
Abdulhameed

@AbdulhameedShalabi如下Willster所述,即使通过ajax获取css,仍然可以对其进行缓存。它取决于资源的原始响应头。
Ed Bayiates

4

    //load css first, then print <link> to header, and execute callback
    //just set var href above this..
    $.ajax({
          url: href,
          dataType: 'css',
          success: function(){                  
                $('<link rel="stylesheet" type="text/css" href="'+href+'" />').appendTo("head");
                //your callback
            }
    });

对于Jquery 1.2.6及更高版本(省略上面的fancy属性功能)。

我这样做是因为,我认为这可以确保在尝试将所需的样式表粘贴到头部之前,它已由ajax加载。因此,在样式表准备好后执行回调。


1
jQuery(dataType:'css')不支持此功能,它对您有用吗?
jayarjo 2012年

有趣..是的,它确实对我有用。我想如果没有dataType参数,这个答案会更正确,我不确定为什么这不会对我造成错误。(请参阅有关使用css dataType的相关主题:bugs.jquery.com/ticket/10082
tmsimont 2012年

效率不高,您下载了css文件,但是没有在“成功”回调中使用下载的字节,然后添加了<link>标记。
Abdulhameed

1

这是一个将通过成功或失败回调加载CSS文件的函数。如果一个或多个资源加载失败,则仅会调用一次失败回调。我认为这种方法比其他一些解决方案更好,因为使用HREF将元素插入DOM会导致额外的浏览器请求(尽管该请求可能来自缓存,具体取决于响应标头)。

function loadCssFiles(urls, successCallback, failureCallback) {

    $.when.apply($,
        $.map(urls, function(url) {
            return $.get(url, function(css) {
                $("<style>" + css + "</style>").appendTo("head");
            });
        })
    ).then(function() {
        if (typeof successCallback === 'function') successCallback();
    }).fail(function() {
        if (typeof failureCallback === 'function') failureCallback();
    });

}

用法如下:

loadCssFiles(["https://test.com/style1.css", "https://test.com/style2.css",],
    function() {
    alert("All resources loaded");
}, function() {
    alert("One or more resources failed to load");
});

这是另一个将加载CSSjavascript文件的函数:

function loadJavascriptAndCssFiles(urls, successCallback, failureCallback) {

    $.when.apply($,
        $.map(urls, function(url) {
            if(url.endsWith(".css")) {
                return $.get(url, function(css) {
                    $("<style>" + css + "</style>").appendTo("head");
                });
            } else {
                return $.getScript(url);
            }
        })
    ).then(function() {
        if (typeof successCallback === 'function') successCallback();
    }).fail(function() {
        if (typeof failureCallback === 'function') failureCallback();
    });

}

请注意此解决方案的一个缺点,如果您使用的是相对源地图,则如果css是内联的(则不是通过<link>标记添加的),则不会找到它。
Willster,

通过将外部资源(css)下载为文本并将其转储到<Style>标记中,您将失去浏览器的缓存功能,因为该浏览器使用css URL作为缓存键进行缓存
Abdulhameed

@AbdulhameedShalabi不,即使通过ajax获取css,仍然可以对其进行缓存。它取决于资源的原始响应头。
Willster,

0

根据您在@Raul回答下的评论,我可以想到两种包含回调的方法:

  1. getScript调用文件加载的CSS。
  2. 使用AJAX加载css文件的内容,并附加到<style>。您的回调将是来自$.get或用于加载css文件内容的回调。

-5

$(“#pageCSS”)。attr('href','./css/new_css.css');

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.