通过 JavaScript 访问 CSS 文件内容

IT技术 javascript jquery css stylesheet
2021-02-19 07:23:01

是否可以在文档中获取 CSS 文件的全部文本内容?例子:

<link rel="stylesheet" id="css" href="/path/to/file.css">
<script>
    var cssFile = document.getElementById('css');
    // get text contents of cssFile
</script>

我并不是真的想通过 document.styleSheets 获取所有 CSS 规则,还有其他方法吗?

更新:当然有 ajax 选项,我很欣赏给出的答案。但是似乎没有必要使用浏览器中已经加载的 ajax 重新加载文件。因此,如果有人知道提取当前 CSS 文件的文本内容的另一种方法(不是 CSS 规则),请发布!

6个回答

使用该特定示例(其中 CSS 与页面位于同一来源),您可以通过ajax以下方式将文件读取为文本

$.ajax({
    url: "/path/to/file.css",
    dataType: "text",
    success: function(cssText) {
        // cssText will be a string containing the text of the file
    }
});

如果要以更结构化的方式访问信息,document.styleSheets则是与文档关联的样式表数组。每个样式表都有一个称为cssRules(或仅rules在某些浏览器上)的属性,它是样式表中每个规则的文本数组。每个规则都有一个cssText属性。所以你可以遍历那些,例如:

$.each(document.styleSheets, function(sheetIndex, sheet) {
    console.log("Looking at styleSheet[" + sheetIndex + "]:");
    $.each(sheet.cssRules || sheet.rules, function(ruleIndex, rule) {
        console.log("rule[" + ruleIndex + "]: " + rule.cssText);
    });
});

现场示例- 该示例有一个带有两个规则的样式表。

@David:那你就必须做额外的 GET。一旦加载并解析了 CSS 文本,就我所知,浏览器不会保留它的原始来源。(HTML 页面也是如此,这就是为什么您会看到“查看源代码”请求获取源文本。)
2021-04-26 07:23:01
可以通过ajax加载css文件的内容,然后在页面中创建一个 <style> 元素,将css注入其中?css 会被应用吗?此方法是否需要在页面头部进行同步 ajax 调用?
2021-04-29 07:23:01
document.styleSheet 东西很好,但不是我需要的。我需要精确的文本内容,而不是要循环的规则数组。可能这点我不是很清楚。
2021-04-30 07:23:01
@SlaterVictoroff - 哪一部分?我会惊讶于SOP(不是CORS,这是一种放松 SOP 的方法)对相同来源的东西的违反。
2021-05-07 07:23:01
@David:不,当您访问该innerHTML属性时,浏览器会创建一个 HTML 字符串,表示您访问它的元素(在这种情况下,整个文档)的 DOM 树的当前状态。这不是在所有相同的页面,可以不同格式的来源,实际上可能已经不同,因为DOM操作以来一直做,可以省略标签浏览器包括,可能有评论浏览器不保留,围绕属性的不同引用,等等,等等。
2021-05-11 07:23:01

get如果样式表包含在同一域中,您可以使用简单的 ajax调用加载内容

更新后编辑
我尝试了此代码(在 FX10 上)作为仅使用一个 CSS 请求的概念证明,但对我来说似乎有点hacky,应该进行测试和验证。如果 javascript 不可用,它也应该通过一些后备来改进。

CSS(外部文件test.css

div { border: 3px solid red;}

HTML/jQuery

<!doctype html >
<html>
    <head>
       <!-- provide a fallback if js not available -->
       <noscript>
          <link rel="stylesheet" href="test.css" />
       </noscript>
    </head>
    <body>

        <div></div>

        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.js"></script>
        <script>
        $(document).ready(function() {

            $.when($.get("test.css"))
            .done(function(response) {
                $('<style />').text(response).appendTo($('head'));
                $('div').html(response);
            });
        })
        </script>
    </body>
</html>

您应该会看到 div 内的 CSS 代码,四周带有红色边框:)
尽情享受吧。

@David:有,我已经发布了。
2021-04-25 07:23:01
是的,刚刚意识到这一点并且它可以工作,但是如果有一个解决方案而无需对已加载的文件提出额外请求,我想听听。
2021-05-02 07:23:01
@TJCrowder 几秒钟前才注意到并更新,谢谢。我想在 <noscript></noscript> 块中包含一个 <link> 元素,但我认为 <head> 元素中的 html 不是有效的。HTML5 会允许这样做吗?( dev.w3.org/html5/markup/noscript.html )
2021-05-02 07:23:01
不错的做法。你真的想用text,不是html使用你的代码的活拷贝textjsbin.com/elopak
2021-05-10 07:23:01
@FabrizioCalderan:可以noscripthead(或几乎在其他任何地方)使用;参考尽管如此,如果可以等待 CSS 直到 ajax 调用完成,我会将 放在noscript文档的最底部。
2021-05-16 07:23:01

不使用 ajax 的情况下获得样式表的最接近方法是确实迭代所有 CSS 规则并将它们连接成一个字符串。这将生成删除所有注释和多余空格的原始文件。这是有道理的,因为浏览器只需要将解析后的样式表保存在内存中,而不是原始文件。它只有3行代码:

function css_text(x) { return x.cssText; }
var file = document.getElementById('css');
var content = Array.prototype.map.call(file.sheet.cssRules, css_text).join('\n');
它还删除浏览器不理解的样式。这正是我需要这个的原因。
2021-04-19 07:23:01

我认为你最好的选择是用 ajax 加载它,例如:

$.get("/path/to/file.css", function(cssContent){
    alert("My CSS = " + cssContent);
});

是的,你可以使用 $.get。

例子:

$.get('/path/to/css/file.css', function (resp) {
    // resp now should contain your CSS file content.

});