2017-05-08 1 views
0

Ich bin auf der Suche nach einer Möglichkeit zum Hot-Swap-Stylesheets, während die Seite geladen wird. Hier ist meine aktuelle Lösung, es funktioniert, aber es hat einige Einschränkungen/Probleme.Elegante Möglichkeit, Thema Stylesheets ohne Neuladen Seite Seite

html Kopf:

<link id="theme" href="themes/theme1.css" rel="stylesheet" type="text/css"> 

js:

themes = [ 
    "themes/theme1.css", 
    "themes/theme2.css" 
]; 

function themeSwitch() { 
    var currentTheme = $("#theme").attr('href'); 
    var themeID = themes.indexOf(currentTheme); 
    themeID = (themeID + 1) % themes.length; 
    $("#theme").attr('href', themes[themeID]); 
} 

Mein Problem mit diesem Ansatz ist, wenn die Funktion der Änderung genannt wird, ist nicht sofort als der Browser eine zusätzliche GET-Anforderung machen muss für die CSS-Datei. Ein weiteres Problem besteht darin, dass der Benutzer die Verbindung vorübergehend trennt, während er die Seite ohne Thema verwendet.

+0

Mögliches Duplikat von [Wie wechsle ich mein CSS Stylesheet mit jQuery?] (Http://stackoverflow.com/questions/7846980/how-do-i-switch-my-css-stylesheet-using-jquery) – Qhuea

+0

@ Qhuea Die Lösung in diesem Problem hat das gleiche Problem, eine GET-Anfrage jedes Mal zu benötigen, wenn das Thema gewechselt wird. – luctowers

Antwort

2

Verwendung alternative Sheet es einfach macht (zB für zwei Themen ist trivial)

<link id="theme" href="themes/theme1.css" rel="stylesheet" type="text/css"> 
<link id="alttheme" href="themes/theme2.css" rel="alternate stylesheet" type="text/css"> 

function themeSwitch() { 
    var t1 = document.getElementById('theme'); 
    var t2 = document.getElementById('alttheme'); 
    t1.disabled = !t1.disabled; 
    t2.disabled = !t1.disabled; 
} 

Eine generische Art und Weise, die eine beliebige Anzahl von Themen

<link class="theme" href="themes/theme1.css" rel="stylesheet" type="text/css"> 
<link class="theme" href="themes/theme2.css" rel="alternate stylesheet" type="text/css"> 
<link class="theme" href="themes/theme3.css" rel="alternate stylesheet" type="text/css"> 

var currentTheme = 0; 
var themes = [].slice.call(document.querySelectorAll('link.theme')); 

function themeSwitch() { 
    currentTheme = (currentTheme + 1) % themes.length; 
    themes.forEach(function(theme, index) { 
     theme.disabled = (index !== currentTheme); 
    }); 
} 

Und als letztes von allen erlaubt , obwohl Sie jQuery nicht markiert haben, verwenden Sie jQuery in Ihrem Code, um der jQuery-Menge zu entsprechen:

<link class="theme" href="themes/theme1.css" rel="stylesheet" type="text/css"> 
<link class="theme" href="themes/theme2.css" rel="alternate stylesheet" type="text/css"> 
<link class="theme" href="themes/theme3.css" rel="alternate stylesheet" type="text/css"> 

var currentTheme = 0; 
var themes = $('link.theme'); 

function themeSwitch() { 
    currentTheme = (currentTheme + 1) % themes.length; 
    themes.each(function(index, theme) { 
     theme.disabled = (index !== currentTheme); 
    }); 
} 
+0

Super, danke! und ich habe es als Jquery markiert. – luctowers

+0

Ich habe das jQuery-Tag nicht gesehen, sorry: p –

Verwandte Themen