代码之家  ›  专栏  ›  技术社区  ›  Danny Lin

使用CSS规则的空样式元素?

  •  4
  • Danny Lin  · 技术社区  · 7 年前

    我正在开发一个网页捕获器,发现从Reddit.com捕获的网页的一些样式表规则丢失了。

    <style type="text/css" data-styled-components="..." data-styled-components-is-local="true">...</style>
    

    打开JavaScript后,脚本将处理样式元素并清空:

    <style type="text/css" data-styled-components="" data-styled-components-is-local="true"></style>
    

    这就是为什么我的捕获者没有得到样式表。

    但是,对于Reddit.com页面,在清空样式元素之后,仍然可以通过 document.styleSheets[1].cssRules ,而 document.styleSheets[1].ownerNode.textContent "" .

    另外,如果我通过运行 document.styleSheets[1].ownerNode.textContent = "/*null*/" 文档.样式表[1].cssRules 变成空的,网页被重新呈现,就像我的抓捕者得到的一样。

    我被这种奇怪的行为弄糊涂了。我想知道为什么以及如何在清空样式元素后保留Reddit.com页面的样式。如有任何信息,敬请垂询。

    0 回复  |  直到 7 年前
        1
  •  2
  •   guest271314    7 年前

    CSS规则 <style> sheet 可以以编程方式插入、添加或修改,其中 .textContent < 元素返回空字符串 "" 如果CSS文本未设置为或附加到 < 元素。

    <!DOCTYPE html>
    <html>
      <head>
        <style id="style"></style>
      </head>
      <body>
        <div>abc</div>
        <p>123</p>
        <script>
          const style = document.querySelector("#style");
          const {sheet} = style;
          sheet.insertRule("div{color:blue}", 0);
          sheet.addRule("p", "color:green", 1);
          console.log(style.textContent);
          style.textContent = "";
          console.assert(style.textContent.length > 0, [style.textContent]); // assertion failed
          console.log(style.textContent === ""); // true
        </script>
      </body>
    
    </html>

    另见 Modify element :before CSS rules programmatically in React