Estoy intentando agregar dinámicamente una regla de hoja de estilo css mediante javascript, algo así como el ejemplo 2 here.Cuándo se agrega una hoja de estilo a document.styleSheets
Funciona la mayor parte del tiempo, pero parece haber una condición de carrera que hace que falle a veces en (al menos) Chrome (15.0.874 y 17.0.933). Ocurre con poca frecuencia cuando el caché está vacío (o ha sido borrado).
Esto es lo que he podido limitar a. Primero cargo una hoja de estilo externa adjuntándola al <head>
y luego creo una nueva hoja de estilo (donde agregaría las reglas). Luego imprimo la longitud de document.styleSheets
(inmediatamente y después de 1 segundo).
$(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);
});
(jugar con él en http://jsfiddle.net/amirshim/gAYzY/13/)
Cuando la caché está claro, a veces se imprime 2
continuación 4
(jsFiddle añade que es propio 2 archivos CSS), lo que significa que no añade ninguna de estilo hojas a document.styleSheets
inmediatamente ... pero probablemente espera a que se cargue el archivo externo.
¿Se espera esto?
Si es así, ¿está roto el Example 2 on MDN (y muchos otros)? Desde la línea 27:
var s = document.styleSheets[document.styleSheets.length - 1];
podría evaluar con document.styleSheets.length == 0
Tenga en cuenta que esto no sucede cuando no cargar el archivo CSS externo en primer lugar.
Me gustaría preguntarle cuál es su resultado final deseado. ¿En qué circunstancias desearía 'insertar' una regla en un archivo css en lugar de simplemente escribirla dentro del archivo css en primer lugar? – Sotkra
Estoy agregando hojas de estilo dinámicamente también ... pero solo después de que el $ (documento) .ready haya disparado ... –
@Kees: El código que di está haciendo todo en '$ (document) .ready'. Eso es lo que '$ (function() {...});' hace. – Amir