javascript - 具有有效 CSS 规则的空样式元素?
问题描述
我正在开发一个网页捕获器,发现从 Reddit.com 捕获的网页的一些样式表规则丢失了。
经过进一步调查,我发现 Reddit.com 页面的源 HTML 代码具有如下样式元素:
<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 页面,在 style 元素被清空后,仍然可以通过document.styleSheets[1].cssRules
while访问document.styleSheets[1].ownerNode.textContent
其样式表规则""
。
此外,如果我通过运行类似的脚本来修改样式元素,则document.styleSheets[1].ownerNode.textContent = "/*null*/"
,document.styleSheets[1].cssRules
将变为空并且重新渲染网页,就像我的捕获器所拥有的一样。
我对这种奇怪的行为感到困惑。我想知道 Reddit.com 页面在清空样式元素后为什么以及如何保留样式。任何信息表示赞赏。
解决方案
可以以编程方式插入、添加或修改<style>
元素的 CSS 规则,如果 CSS 文本未设置或附加到元素,则元素的返回空字符串。sheet
.textContent
<style>
""
<style>
<!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>
推荐阅读
- c# - 如何使用 ASP .NET CORE 从控制器传递 AJAX 响应(真/假)
- azure - 将图像上传到 blob 容器的字节数为零
- r - match.names(clabs, names(xi)) 中的错误:名称与以前的名称不匹配
- ssl - 奇怪的 SSL 公用名不匹配
- php - 在外部脚本中使用 wordpress 操作
- plsql - 行级触发器问题
- python - 当 pred_fn_pairs 从 for 循环构建时,Tensorflow 案例功能不起作用
- javascript - 如何在发送对象的同时使用护照进行身份验证
- c# - 我无法再使用 Azure Function 从 local.setting.json 获取值
- python - 获取请求历史记录的日期/时间