在研究附加CSS与处理指令的优缺点时<?xml-stylesheet>
,我遇到了一些问题。
假设我们有一个简单的 XHTML 文档(以application/xhtml+xml
MIME 类型交付并在 Web 浏览器中查看):
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>A sample XHTML document</title>
<script type="application/javascript" src="/script.js"></script>
</head>
<body>
<h1>A heading</h1>
</body>
</html>
然后我们有一个外部CSS文件(让它命名style.css
并放在根目录中):
h1 { color: red; }
首先,在 中script.js
,我将这个 CSS 动态附加到一个link
元素中:
const link = document.createElement('link');
Object.entries({rel: 'stylesheet', type: 'text/css', href: '/style.css'})
.forEach(([name, value]) => link.setAttribute(name, value));
document.head.appendChild(link);
然后脚本等待样式表完成加载并通过sheet
属性到达它:
link.addEventListener('load', function() {
const stylesheet = link.sheet;
});
在此之后,脚本可以操作这个样式表,例如:
stylesheet.cssRules.item(0).style.color = 'green'; // modify an existing rule
stylesheet.insertRule('body { background: #ffc; }', 1); // insert a new rule
<?xml-stylesheet>
但是现在,如果样式表附有处理指令,我无法弄清楚是否可以进行相同的操作:
const pi = document.createProcessingInstruction('xml-stylesheet',
'href="/style.css" type="text/css"');
document.insertBefore(pi, document.documentElement);
首先,PI 似乎没有load
事件,因此脚本无法知道样式表何时准备就绪。其次,没有像sheet
属性这样的东西,所以你不能调用pi.sheet
来访问样式表。
有什么办法可以克服这些困难并从脚本到与<?xml-stylesheet>
PI 相关的样式表?