使用 CSS 序列化和反序列化 HTML 样式标签

Serialized and deserialize HTML style tag with CSS

我想做什么:

现在怎么连载

问题

当我序列化包含 css 的 style 节点时:

.a > .b {
  color: red
}

他们实际上像

一样被序列化了
.a > .b {
  color: red
}

这不是有效的 CSS,因此无法正确解析。

符号更大的问题是我观察到的唯一问题,但这让我想知道其他潜在的序列化问题。

问题:如何以不破坏 CSS 的方式序列化样式节点?

看来这与在新文档上动态创建样式节点有关。

最简单的复现如下:

const doc = new Document()

const style = doc.createElement('style')
style.textContent = '.a>.b { color: red; }'

console.log(style.outerHTML)

产生 <style>.a&gt;.b {color:red}</style>

似乎作为主动渲染的一部分 document/or 只是通常被添加到文档中而不只是使用它创建在样式节点上有一些 side-effect,这导致它被正确序列化尽管。所以现在我改为执行以下操作作为解决方法,这有点难看但有效:

const doc = new DOMParser().parseFromString('<html><head></head><body></body></html>', 'text/html')


const style = doc.createElement('style')
style.textContent = '.a>.b { color: red; }'

doc.body.append(style)

console.log(style.outerHTML)

doc.body.removeChild(style)

这会产生一个适当的序列化 <style>.a>.b { color: red; }</style>

现在这解决了我的问题,但我仍然很想更详细地了解这里发生了什么(例如 side-effect 到底是什么 how/when 是否被触发),因此希望对此发表评论!