Gibt es eine Möglichkeit, CSS aus einer Zeichenfolge in der Javascript-Datei zum Kopf eines Dokuments mit Javascript hinzuzufügen?
Angenommen, wir haben eine Webseite mit einem Lightbox-Skript. Für dieses Skript ist eine CSS-Datei erforderlich.
<link>
Wenn Sie nun diese CSS-Datei mit hinzufügen, wird die CSS-Datei auch für Personen heruntergeladen, für die js nicht aktiviert ist.
Ich weiß, dass ich die CSS-Datei dynamisch mit dem Skript laden kann, aber das bedeutet auch, dass es 2 http-Anforderungen gibt, und in Fällen, in denen wenig bis gar kein CSS in der Datei vorhanden ist, finde ich dies ineffizient.
Also dachte ich mir, was wäre, wenn Sie das CSS, das Sie in der CSS-Datei haben, in das Skript einfügen, das Skript das CSS analysieren und in den Kopf einfügen könnten, oder noch besser, das Skript das CSS direkt hinzufügen lassen sollte das <head>
des Dokuments.
Aber ich habe online nichts gefunden, was darauf hindeutet, dass dies möglich ist. Ist es also möglich, dem Kopf mit js CSS hinzuzufügen?
Bearbeiten + LÖSUNG:
Ich habe Roryfs Antwort bearbeitet, um browserübergreifend zu arbeiten (außer IE5).
Javascript:
function addcss(css){
var head = document.getElementsByTagName('head')[0];
var s = document.createElement('style');
s.setAttribute('type', 'text/css');
if (s.styleSheet) { // IE
s.styleSheet.cssText = css;
} else { // the world
s.appendChild(document.createTextNode(css));
}
head.appendChild(s);
}
quelle
Antworten:
Wie möchten Sie
<head>
mit JavaScript eine CSS-Zeichenfolge hinzufügen ? Wenn Sie eine CSS-Zeichenfolge in eine Seite einfügen, ist dies mit dem<link>
Element einfacher als mit dem<style>
Element.Im Folgenden wird
p { color: green; }
der Seite eine Regel hinzugefügt.<link rel="stylesheet" type="text/css" href="data:text/css;charset=UTF-8,p%20%7B%20color%3A%20green%3B%20%7D" />
Sie können dies in JavaScript einfach durch URL-Codierung Ihrer CSS-Zeichenfolge und Hinzufügen des
HREF
Attributs erstellen . Viel einfacher als alle Macken von<style>
Elementen oder der direkte Zugriff auf Stylesheets.var linkElement = this.document.createElement('link'); linkElement.setAttribute('rel', 'stylesheet'); linkElement.setAttribute('type', 'text/css'); linkElement.setAttribute('href', 'data:text/css;charset=UTF-8,' + encodeURIComponent(myStringOfstyles));
Dies funktioniert ab IE 5.5
Die von Ihnen markierte Lösung funktioniert, diese Lösung erfordert jedoch weniger Dom-Operationen und nur ein einziges Element.
quelle
let linkElement: HTMLLinkElement = this.document.createElement('link');
wird in IE 5.5 funktionieren, sagst du?let linkElement: HTMLLinkElement = ...
- Wie heißt diese Syntax?Bearbeiten : Wie der Kommentar von Atspulgs andeutet, können Sie dasselbe ohne jQuery mit dem querySelector erreichen :
document.querySelector('head').innerHTML += '<link rel="stylesheet" href="styles.css" type="text/css"/>';
Ältere Antwort unten.
Mit der jQuery- Bibliothek können Sie Ihr head-Element auswählen und HTML anhängen, und zwar auf folgende Weise:
$('head').append('<link rel="stylesheet" href="style2.css" type="text/css" />');
Ein vollständiges Tutorial zu diesem Problem finden Sie hier
quelle
document.head
ist dashead
Element!Wenn Sie sich nicht auf eine Javascript-Bibliothek verlassen möchten, können Sie
document.write()
das erforderliche CSS, das instyle
Tags verpackt ist , direkt in das Dokument ausspuckenhead
:<head> <script type="text/javascript"> document.write("<style>body { background-color:#000 }</style>"); </script> # other stuff.. </head>
Auf diese Weise vermeiden Sie das Auslösen einer zusätzlichen HTTP-Anforderung.
Es gibt andere Lösungen, die vorgeschlagen / hinzugefügt / entfernt wurden, aber ich sehe keinen Grund darin, etwas zu komplizieren, das bereits browserübergreifend funktioniert. Viel Glück!
http://jsbin.com/oqede3/edit
quelle
document.write
nicht in echten XHTML-Dokumenten, aber das ist wahrscheinlich kein Problem, da kaum jemand XHTML wirklich verwendet.Eine einfache Nicht-jQuery-Lösung, wenn auch mit einem kleinen Hack für den IE:
var css = ".lightbox { width: 400px; height: 400px; border: 1px solid #333}"; var htmlDiv = document.createElement('div'); htmlDiv.innerHTML = '<p>foo</p><style>' + css + '</style>'; document.getElementsByTagName('head')[0].appendChild(htmlDiv.childNodes[1]);
Es scheint IE erlaubt keine Einstellung
innerText
,innerHTML
oder die VerwendungappendChild
aufstyle
Elemente. Hier ist ein Fehlerbericht, der dies demonstriert, obwohl ich denke, dass er das Problem falsch identifiziert. Die obige Problemumgehung stammt aus den Kommentaren zum Fehlerbericht und wurde in IE6 und IE9 getestet.Ob Sie dies, document.write oder eine komplexere Lösung verwenden, hängt wirklich von Ihrer Situation ab.
quelle
document.createElement('style')
.styleElement.innerHTML = css;
. Sicherlich schlägt dies in IE 7 fehl und wird jetzt in IE 6 erneut getestet (wartet darauf, dass die VM lebendig wird).Hier ist eine Funktion, die dynamisch eine CSS-Regel in allen gängigen Browsern erstellt.
createCssRule
Nimmt einen Selektor (zB "p.purpleText"), eine Regel (zB "Farbe: lila;") und optional aDocument
(das aktuelle Dokument wird standardmäßig verwendet):var addRule; if (typeof document.styleSheets != "undefined" && document.styleSheets) { addRule = function(selector, rule) { var styleSheets = document.styleSheets, styleSheet; if (styleSheets && styleSheets.length) { styleSheet = styleSheets[styleSheets.length - 1]; if (styleSheet.addRule) { styleSheet.addRule(selector, rule) } else if (typeof styleSheet.cssText == "string") { styleSheet.cssText = selector + " {" + rule + "}"; } else if (styleSheet.insertRule && styleSheet.cssRules) { styleSheet.insertRule(selector + " {" + rule + "}", styleSheet.cssRules.length); } } } } else { addRule = function(selector, rule, el, doc) { el.appendChild(doc.createTextNode(selector + " {" + rule + "}")); }; } function createCssRule(selector, rule, doc) { doc = doc || document; var head = doc.getElementsByTagName("head")[0]; if (head && addRule) { var styleEl = doc.createElement("style"); styleEl.type = "text/css"; styleEl.media = "screen"; head.appendChild(styleEl); addRule(selector, rule, styleEl, doc); styleEl = null; } }; createCssRule("body", "background-color: purple;");
quelle
Hier ist ein einfacher Weg.
/** * Add css to the document * @param {string} css */ function addCssToDocument(css){ var style = document.createElement('style') style.innerText = css document.head.appendChild(style) }
quelle