如何应用 jQuery 动态加载的内联和/或外部 CSS

Posted

技术标签:

【中文标题】如何应用 jQuery 动态加载的内联和/或外部 CSS【英文标题】:How to apply inline and/or external CSS loaded dynamically with jQuery 【发布时间】:2010-10-22 18:24:26 【问题描述】:

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

我只是使用一个简单的 .get 请求来加载 html

  $.get(contentUrl, null, function(response) 
         $('#dialog').find('.bd').assertOne().html(response);
     , "waitDlg");

现在的问题是加载的内容需要它自己的 CSS,它实际上是动态创建的。我可以选择内联或使用外部 CSS 样式表。

在 Chrome 中的测试表明,通过 AJAX 加载的 CSS 在使用上述代码添加到 DOM 时并未评估/应用。

Internet Explorer 评估内联 CSS,当它卡在 DOM 中时,Chrome 不会。由于一个完全不相关的问题,我目前无法在 FireFox 中进行测试。

在 jQuery 中有什么方法可以评估作为内联或动态添加到 DOM 的样式表?

我愿意这样做的原因有很多:

弹出窗口中的 CSS 属于弹出窗口,可能完全来自不同的环境 它是动态的,我不想把它放在父页面中,除非我必须这样做 我计划让它像这样工作,但它没有! :-(

【问题讨论】:

【参考方案1】:

给定样式表的路径(或一些将生成有效 CSS 的 URL):

var myStylesLocation = "myStyles.css";

...其中任何一个都应该工作:

使用 AJAX 加载

$.get(myStylesLocation, function(css)

   $('<style type="text/css"></style>')
      .html(css)
      .appendTo("head");
);   

使用动态创建的加载

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

使用动态创建的

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

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

【讨论】:

这看起来很棒。 AFAYK 这些都是“支持”的方式吗?或者这完全是 hacky?它看起来很有希望,但我担心一个浏览器不会让我这样做。 它们都是有效的,但唯一确定给定浏览器是否正确响应不断变化的 DOM 的方法是尝试它。最后两个(谢谢,gs!)还有一个额外的警告:如果您的服务器配置错误并使用错误的 MIME 类型发送您的 CSS,Firefox 将忽略它,除非您的页面处于 quirks 模式。 效果很好:$('') .appendTo("head"); 可能无法在 IE7 上运行。尚未验证 - 但请参阅@user406905 的回答 如果 *** 有一个包含所有浏览器和版本的小弹出测试矩阵,我们可以标记哪些组合适用于每个答案,那就太酷了。有点像matrix.cpantesters.org/?dist=WWW-Mechanize+1.72【参考方案2】:

已接受的答案在 IE 7 中不起作用(在 IE 8 中存在错误)。以下内容适用于 IE 以及 FF 和 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);

【讨论】:

谢谢!现在,如果我能记住我在哪里使用它,那么我可以去改变它 这适用于 ie8 但不适用于 ie7。接受的答案在两者中都不起作用。 这适用于 IE 8 document.createStyleSheet,是的:其他技术在 IE 8 中似乎非常有问题。它们可以工作,但页面越大/加载越慢,它似乎停止工作。 document.createStyleSheet到目前为止对我来说效果很好【参考方案3】:
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 的问题中。

以上是关于如何应用 jQuery 动态加载的内联和/或外部 CSS的主要内容,如果未能解决你的问题,请参考以下文章

如何将动态外部组件加载到 Angular 应用程序中

如何在不引用外部 CSS 文件的情况下在 WordPress PHP 文件中创建内联 CSS?

如何将带有css样式的内联SVG从浏览器保存/导出到图像文件

如何动态加载js文件

外部脚本未以角度 5 动态加载

JQuery的一些注意事项- AJAX 学习笔记