jQuery theme switcher for multiple stylesheets
I would like to use this styleswitcher script (http://www.kelvinluck.com/assets/jquery/styleswitch/),but have it load 2 stylesheets at once. The objective is the user can select a font size and/or colour and/or screen width. Not sure if it's just a case of adding a function to handle more than one cookie?
Here's what I have so far: (http://www.digitalkulture.com/example/)
If anyone has an idea, I'd be grateful. Thank you.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- Stylesheets -->
<link rel="stylesheet" type="text/css" href="styles/defaultTheme.css" />
<link rel="alternate stylesheet" type="text/css" href="styles/silverTheme.css" title="silverTheme" />
<link rel="alternate stylesheet" type="text/css" href="styles/purpleTheme.css" title="purpleTheme" />
<link rel="alternate stylesheet" type="text/css" href="styles/highvisTheme.css" title="highvisTheme" />
<link rel="alternate stylesheet" type="text/css" href="styles/wideScreen.css" title="wideScreen" />
<link rel="alternate stylesheet" type="text/css" href="styles/fullScreen.css" title="fullScreen" />
<link rel="alternate stylesheet" type="text/css" href="styles/bigText.css" title="bigText" />
<!-- Scripts -->
<script type="text/javascript" src="js/jquery-1.6.1.js" /></script>
<script type="text/javascript" src="js/styleswitcher.js" /></script>
<script type="text/javascript">
// initialise plugins
jQuery(function(){
var $sw_link = jQuery("a[title='themes_switch']");
jQuery(".dashTemplate a[title*=Theme]").click(function(){
jQuery(".dashTemplate a[title*=Theme]").removeClass("current");
jQuery(this).addClass("current");
});
jQuery(".dashTemplate a[title*=Screen]").click(function(){
jQuery(".dashTemplate a[title*=Screen]").removeClass("current");
jQuery(this).addClass("current");
});
jQuery(".dashTemplate a[title*=Text]").click(function(){
jQuery(".dashTemplate a[title*=Text]").removeClass("current");
jQuery(this).addClass("current");
});
jQuery(".dashTemplate a[title='defaultTheme']").addClass("defaultTheme").click(function(){
setActiveStyleSheet('defaultTheme');
return false;
});
jQuery(".dashTemplate a[title='silverTheme']").addClass("silverTheme").click(function(){
setActiveStyleSheet('silverTheme');
return false;
});
jQuery(".dashTemplate a[title='purpleTheme']").addClass("purpleTheme").click(function(){
setActiveStyleSheet('purpleTheme');
return false;
});
jQuery(".dashTemplate a[title='highvisTheme']").addClass("highvisTheme").click(function(){
setActiveStyleSheet('highvisTheme');
return false;
});
jQuery(".dashTemplate a[title='wideScreen']").addClass("wideScreen").click(function(){
setActiveStyleSheet('wideScreen');
return false;
});
jQuery(".dashTemplate a[title='fullScreen']").addClass("fullScreen").click(function(){
setActiveStyleSheet('fullScreen');
return false;
});
jQuery(".dashTemplate a[title='bigText']").addClass("bigText").click(function(){
setActiveStyleSheet('bigText');
return false;
});
});
</script>
</head>
<body>
<div class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent tempus, purus non ultrices convallis, leo massa porta erat, et gravida magna quam at ante. Vivamus vitae sem lectus. Aliqu开发者_运维问答am augue tortor, tincidunt vitae tempus ac, porta eu sem. Mauris laoreet erat vitae metus venenatis ac lacinia lorem ultricies.
</div>
<!--HTML selectors-->
<ul class="dashTemplate">
<li><a class="defaultTheme" title="defaultTheme" href="#">reset color</a> |
<li><a class="silverTheme" title="silverTheme" href="#">silver color</a> |
<li><a class="purpleTheme" title="purpleTheme" href="#">purple color</a> |
<li><a class="highvisTheme" title="highvisTheme" href="#">yellow color</a></li>
</ul>
<ul class="dashTemplate">
<li><a class="wideScreen" title="wideScreen" href="#">wide screen</a> |
<li><a class="fullScreen" title="fullScreen" href="#">full screen</a> |
<li><a class="defaultTheme" title="defaultTheme" href="#">reset</a></li>
</ul>
<ul class="dashTemplate">
<li><a class="bigText" title="bigText" href="#">big text</a> |
<li><a class="defaultTheme" title="defaultTheme" href="#">reset</a></li>
</ul>
</body>
</html>
The styleswitcher.js file
function setActiveStyleSheet(title) {
var i, a, main;
for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
a.disabled = true;
if(a.getAttribute("title") == title) a.disabled = false;
}
}
}
function getActiveStyleSheet() {
var i, a;
for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled) return a.getAttribute("title");
}
return null;
}
function getPreferredStyleSheet() {
var i, a;
for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
if(a.getAttribute("rel").indexOf("style") != -1
&& a.getAttribute("rel").indexOf("alt") == -1
&& a.getAttribute("title")
) return a.getAttribute("title");
}
return null;
}
function createCookie(name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
}
else expires = "";
document.cookie = name+"="+value+expires+"; path=/";
}
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
window.onload = function(e) {
var cookie = readCookie("style");
var title = cookie ? cookie : getPreferredStyleSheet();
setActiveStyleSheet(title);
}
window.onunload = function(e) {
var title = getActiveStyleSheet();
createCookie("style", title, 365);
}
var cookie = readCookie("style");
var title = cookie ? cookie : getPreferredStyleSheet();
setActiveStyleSheet(title);
To apply two stylesheets, download the themes using the css scope option. This prefaces all fields with the scope you provide. For example, let's say you want two, we can say add .ex1
to the first and .ex2
to the second. (Actually type in the '.' before the name in the download form).
Then when you want to use them you can do this
<button id="btn1" class=".ex1">Button 1</button>
<button id="btn2" class=".ex2">Button 2</button>
$('#btn1').button();
$('#btn2').button();
This should apply the styles in the file with '.ex1' to the first button and the styles with the file with '.ex2'.
I know exactly what you're trying to achieve, since I'm working on the exact same functionality for a project at work! I don't know this for a fact, but I suspect that the kevinluck script that you're using is a fork of the alistapart script, which was published about 5 years prior, in 2001.
http://www.alistapart.com/articles/alternate/
I haven't gotten the final solution working yet, as I'm still researching some items involving arrays and reading/writing to cookies. But here's a partial solution, which persists a specified stylesheet on top of a default stylesheet:
function setActiveStyleSheet(title) {
var i, a, main, active, elements;
elements = document.getElementsByTagName("link");
// search through each stylesheet
for(i=0; elements.length; i++) {
a = elements[i];
// check that the style sheet has a title and attribute is not empty
if((a.getAttribute("rel").indexOf("style") != -1) && a.getAttribute("title")) {
if ((a.getAttribute("title") == title) && (a.disabled == false)){
active = true;
};
// disable stylesheet
a.disabled = true;
// if the stylesheet is marked 'default', turned it on
if (a.getAttribute("title") == "default"){
a.disabled = false;
}
// if the stylesheet has the title we're trying to set, turned it on
if (a.getAttribute("title") == title){
a.disabled = false;
}
// or if it was already on, in which case we turn it on
if (active) {
a.disabled = false;
};
}
}
}
You might call it a 1.5 stylesheet solution, rather than a 2 stylesheet solution. Anyhow, the final solution is going to involve either writing multiple cookies that each contain a single stylesheet reference, or writing a compound cookie of sorts, that contains multiple stylesheet references.
If/when I get this researched and resolved, I'll post the rest of the solution. Until then, hoping somebody with more experience with cookies will be able to contribute...
Best, Abigail
For anybody who's implementing this functionality for the first time, be sure to check out the wikipedia entry on cookies:
http://en.wikipedia.org/wiki/HTTP_cookie
Possibly the most important information therein is how to quickly and easily access the loaded cookies. Type the following in the URL bar of your browser:
javascript:alert(document.cookie)
Also, the following snippet added to the bottom of the previous function will create a unique cookie for each stylesheet:
// if the stylesheet is active, write a cookie and persist it
if (a.disabled == false) {
var cookieName = 'stylesheet' + i;
createCookie(cookieName, a.getAttribute("title"), 30);
};
The last part of the process is to get a function to read in each of the stylesheets. Hopefully will finish that sometime in the next couple of days...
Hmmm... found a possible alternative solution that's worth considering:
http://www.alistapart.com/articles/bodyswitchers/ http://www.alistapart.com/d/bodyswitchers/iotbs.js
Rather than setting stylesheets, it simply sets a class on the body tag; which nicely solves the problem of applying multiple styles to document elements. Not sure how flexible the script is for use on elements other than . Also, since it's Javascript, it's client side, and one can't apply any server side if/then logic (i.e. no automated stylesheets for production vs development environments).
精彩评论