【发布时间】:2017-05-20 17:15:05
【问题描述】:
在研究使用<?xml-stylesheet>处理指令附加CSS的优缺点时,我遇到了一些问题。
假设我们有一个简单的 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 中,我使用link 元素动态附加此CSS:
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 关联的样式表?
【问题讨论】:
-
你想用加工指令达到什么目的?
-
@guest271314,我正在调查使用
<?xml-stylesheet>附加样式表的优缺点。 -
“这个对象没有任何事件,也没有任何属性来获取它的样式表。” 不确定问题是什么?您是否尝试获取并解析在
xhtmldocument中加载的StyleSheet?您能否包括xhtmldocument和您尝试过的内容,并在问题中描述要求? -
实际上,我认为您根本无法使用处理器指令“做”任何事情。如果您需要对样式表的加载进行那种级别的控制,请使用 。另一方面,如果您只需要知道所有样式表何时完成加载,您可以使用
window.onload... -
@MrLister,我的脚本动态插入了
<!xml-stylesheet>,在window.onload被触发很久之后。
标签: javascript css xhtml processing-instruction cssom