【发布时间】:2011-12-25 00:23:16
【问题描述】:
我正在尝试使用 javascript 动态添加 css 样式表规则,例如示例 2 here.
它在大多数情况下都有效,但似乎存在一种竞争条件,使其有时在(至少)Chrome(15.0.874 和 17.0.933)中失败。当缓存为空(或已被清除)时,这种情况很少发生。
这是我能够缩小范围的内容。首先,我通过将外部样式表附加到<head> 来加载它,然后我创建一个新样式表(我将在其中添加规则)。然后我打印 document.styleSheets 的长度(立即和 1 秒后)。
$(function() {
// it doesn't happen if this line is missing.
$("head").append('<link rel="stylesheet" type="text/css"'+
'href="/css/normalize.css" />');
var stylesheet = document.createElement("style");
stylesheet.setAttribute("type", "text/css");
document.getElementsByTagName('head')[0].appendChild(stylesheet);
var b = $('body');
b.append(document.styleSheets.length).append('<br/>');
setTimeout(function() {
b.append(document.styleSheets.length).append('<br/>');
}, 1000);
});
(在http://jsfiddle.net/amirshim/gAYzY/13/玩它)
当缓存被清除时,它有时会打印2 然后是4(jsfiddle 添加它自己的2个css文件),这意味着它不会立即将任何一个样式表添加到document.styleSheets...但可能等待外部文件加载。
这是预期的吗?
如果是这样,Example 2 on MDN(以及其他许多人)是否坏了?从第 27 行开始:
var s = document.styleSheets[document.styleSheets.length - 1];
可能会使用document.styleSheets.length == 0进行评估
请注意,当我不先加载外部 CSS 文件时,不会发生这种情况。
【问题讨论】:
-
我想问你想要的最终结果是什么。在什么情况下,您希望将规则“注入”到 css 文件中,而不是首先将其写入 css 文件中?
-
我也在动态添加样式表...但仅在 $(document).ready 触发后...
-
@Kees:我给出的代码是在
$(document).ready中执行所有操作。这就是$(function() {...});所做的。 -
@Sotkra 我们有一个开发人员工作流程(不一定是合理的),有时只修改您正在处理的 JS 文件比修改 JS 和(共享)CSS 文件更容易,所以我提供一个函数
addRule(...),它允许开发人员为 js 文件生成的页面动态添加规则。通常它们会在以后合并到 CSS 文件中。另一个原因是动态风格的变化;看看jqueryui.com/themeroller
标签: javascript jquery css google-chrome stylesheet