我想動態添加使用javascript CSS樣式表規則,類似例子2 here。當一個樣式表添加到document.styleSheets
它工作的大部分時間,但似乎是一個競爭狀態,使得它在(至少)鉻(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文件內的第一個地方? – Sotkra
我也在動態地添加樣式表......但是隻有在$(document).ready已經觸發後... –
@Kees:我給出的代碼是在'$(document).ready'中做所有事情。這就是'$(function(){...});'做的。 – Amir