首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >序列化编程CSS样式表(使用CSSOM API的样式表)?

序列化编程CSS样式表(使用CSSOM API的样式表)?
EN

Stack Overflow用户
提问于 2022-06-04 03:30:19
回答 1查看 100关注 0票数 2

可以使用document.documentElement.outerHTML将文档序列化为HTML。

但是,如果我们将结果粘贴到文件中并尝试将其呈现为HTML,那么它并不总是忠实于原始显示(忽略真正的动态元素,比如canvas)。为什么?任何在JS中使用CSS的网站都会有影响网页样式的空样式标记。这些样式表是使用CSSOM API操作的。

我想序列化网页,同时也包括通过编程操作的样式表。做这件事最好的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-04 05:11:14

我的解决方案:

代码语言:javascript
复制
export function getCSSOMStyles(): string {
  const { styleSheets } = document;
  const CSSOMSheets = Array.from(styleSheets).filter((sheet) => {
    const hasHref = Boolean(sheet.href);
    //@ts-expect-error - too hard to Typescriptify
    const hasStylesInDOM = (sheet.ownerNode?.innerText?.length || 0) > 0;
    return sheet.cssRules && !hasHref! && !hasStylesInDOM;
  });

  const CSSOMStylesText = CSSOMSheets.map((sheet) =>
    Array.from(sheet.cssRules)
      .map((rule) => rule.cssText)
      .join("")
  ).join("");
  return CSSOMStylesText;
}

export const injectCSSOMStyles = (document: Document) => {
  const styles = getCSSOMStyles();
  if (styles.length === 0) return;

  const styleSheet = document.createElement("style");
  // TODO: Why is this deprecated?
  styleSheet.type = "text/css";
  const stylesText = document.createTextNode(getCSSOMStyles());
  styleSheet.appendChild(stylesText);
  document.head.appendChild(styleSheet);
};

export const serializeCSSInJSStyles = injectCSSOMStyles;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72496854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档