加载外部css文件,如jquery中的脚本,也兼容

时间:2010-04-21 18:38:06

标签: jquery

有没有办法加载外部CSS文件,比如我们使用.getScript方法加载JS文件,也使用像.getScript中的回调函数

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

这适用于FireFox和类似但不在IE中。

8 个答案:

答案 0 :(得分:103)

在jQuery 1.4中:

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

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

答案 1 :(得分:17)

基于回复的快速功能。

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

答案 2 :(得分:16)

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

答案 3 :(得分: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
    }
});

答案 4 :(得分:3)

    //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及更高版本(省略上面的花哨属性函数)。

我这样做是因为我认为这将确保您尝试将其粘贴到头部之前由ajax加载您请求的样式表。因此,在样式表准备就绪后执行回调。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

这是一个将通过成功或失败回调加载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");
});

这是另一个可同时加载CSS javascript文件的功能:

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

}

答案 7 :(得分:-4)

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