如何使用jQuery动态加载内联和/或外部CSS样式?

43

我有一个Ajax控件,使用jQuery加载到Yahoo弹出窗口中。

我只是使用简单的.get请求来加载HTML。

  $.get(contentUrl, null, function(response) {
         $('#dialog').find('.bd').assertOne().html(response);
     }, "waitDlg");
现在的问题是加载的内容需要自己的CSS,实际上是动态创建的。我可以选择内联或使用外部CSS样式表。在Chrome中进行测试显示通过AJAX加载的CSS在添加到DOM时不会被评估/应用。Internet Explorer会在它被卡在DOM中时评估内联CSS,但Chrome不会。由于一个完全无关的问题,我目前无法在FireFox中进行测试。在jQuery中有没有一种方法可以评估作为inline或external动态添加到DOM中的样式表?我想这样做有很多原因:弹出窗口中的CSS属于弹出窗口,可能来自完全不同的环境;它是动态的,除非绝对必要,否则我不想将它放在父页面中;我计划它像这样工作,但它没有! :-(
3个回答

78

给定你样式表的路径(或者某个可以生成有效CSS的URL):

var myStylesLocation = "myStyles.css";

这两个都应该可以使用:

使用AJAX加载

$.get(myStylesLocation, function(css)
{
   $('<style type="text/css"></style>')
      .html(css)
      .appendTo("head");
});   

使用动态创建的<link>标签进行加载

$('<link rel="stylesheet" type="text/css" href="'+myStylesLocation+'" >')
   .appendTo("head");

使用动态创建的<style>标签加载

$('<style type="text/css"></style>')
    .html('@import url("' + myStylesLocation + '")')
    .appendTo("head");
或者
$('<style type="text/css">@import url("' + myStylesLocation + '")</style>')
    .appendTo("head");

1
它们都是有效的,但要确定给定的浏览器是否正确地响应更改的DOM,唯一的方法是尝试。最后两个(感谢gs!)附带一个额外的警告:如果您的服务器配置不正确并且使用错误的MIME类型发送CSS,则除非您的页面处于quirks模式,否则Firefox将忽略它。 - Shog9
1
非常好用:$('<link rel="stylesheet" type="text/css" href="'+myStylesLocation+'" >') .appendTo("head"); - Simon_Weaver
可能不支持IE7。我还没有验证,但请参考@user406905的答案。 - Simon_Weaver
9
如果 StackOverflow 能够有一个小弹出测试矩阵,列出所有浏览器和版本,并且我们可以为每个回答标记哪些组合可行,那将非常棒。就像这个网站的样子:http://matrix.cpantesters.org/?dist=WWW-Mechanize+1.72 - Matthew Lock
我要点踩,因为答案摘要中没有包含用户406905的答案,并且我能够重现除document.createStyleSheet之外的加载技术问题,特别是在IE 8的情况下。这并不总是发生(简单的测试页面似乎可以加载CSS),但页面越大,CSS就越容易完全无法加载。 - Toskan
显示剩余3条评论

27

被接受的答案在IE 7中无法工作(在IE 8中有缺陷)。以下内容可以在IE、Firefox、Chrome/Safari中正常工作:

var url = 'urlOfStyleSheet.css'
if(document.createStyleSheet) {
    try { document.createStyleSheet(url); } catch (e) { }
}
else {
    var css;
    css         = document.createElement('link');
    css.rel     = 'stylesheet';
    css.type    = 'text/css';
    css.media   = "all";
    css.href    = url;
    document.getElementsByTagName("head")[0].appendChild(css);
}

1
谢谢!现在如果我能记得我在哪里使用了它,那我就可以去更改它了。 - Simon_Weaver
这在IE8中可以工作,但在IE7中不行。 接受的答案在两者中都不起作用。 - orourkedd
这适用于IE 8的document.createStyleSheet是有效的,而且其他技术在IE 8上似乎非常不稳定。它们可以工作,但页面越大/加载越慢,它似乎就停止工作了。document.createStyleSheet对我来说一直很好用。 - Toskan

1
var cssPath = "/path/to/css/";

var linkStr = document.createElement("&lt;link rel='stylesheet' type='text/css' href='"+cssPath+"' media='screen' /&gt;");

document.getElementsByTagName("head")[0].appendChild(linkStr);

抱歉,本意是要在Cris Rus的问题下添加评论。 - Toby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接