Sto provando ad aggiungere dinamicamente una regola del foglio di stile CSS utilizzando javascript, ad esempio l'esempio 2 here.Quando è aggiunto un foglio di stile a document.styleSheets
Funziona la maggior parte del tempo, ma sembra che ci sia una condizione di competizione che a volte fallisce in (almeno) Chrome (15.0.874 e 17.0.933). Succede raramente quando la cache è vuota (o è stata cancellata).
Ecco a cosa sono riuscito a restringerlo. Per prima cosa carico un foglio di stile esterno aggiungendolo a <head>
e poi creo un nuovo foglio di stile (dove aggiungerei le regole). Quindi stampo la lunghezza di document.styleSheets
(immediatamente e dopo 1 secondo).
$(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);
});
(giocare con lui a http://jsfiddle.net/amirshim/gAYzY/13/)
Quando la cache è chiaro, a volte stampa 2
poi 4
(jsfiddle aggiunge che è proprio 2 file CSS), il che significa che non aggiunge né dello stile fogli a document.styleSheets
immediatamente ... ma probabilmente attende il caricamento del file esterno.
È previsto?
Se sì, è Example 2 on MDN (e molti altri là fuori) rotto? Dal momento che la linea 27:
var s = document.styleSheets[document.styleSheets.length - 1];
potrebbe valutare con document.styleSheets.length == 0
Si noti che questo non succede quando non caricare il file CSS esterno prima.
Mi piacerebbe chiederti qual è il risultato finale desiderato. In quali circostanze vorreste "iniettare" una regola in un file css invece di averlo scritto all'interno del file css al primo posto? – Sotkra
Aggiungo dinamicamente anche il foglio di stile ... ma solo dopo che $ (document) .ready ha sparato ... –
@Kees: Il codice che ho dato sta facendo tutto in '$ (document) .ready'. Questo è ciò che '$ (function() {...});' does. – Amir