网上找了段换肤的代码,看了下其实也比较简单,主要就要用到他的GetCookie和SetCookie,其他的就根据自己需求改造了。
过程中前后遇到了几个问题所以就折腾了一晚上。为什么这些特殊问题都让我遇到。
我的css文件保存方式是,Skin目录下放置皮肤名文件夹,然后皮肤名文件夹下面都是相同的文件名css内容不同index.css和share.css等。index.css使用@import(share.css)导入共享样式。
一直调试换肤不成功。后来终于发现,不能动态的使用import样式。
于是就在页面中写入两个css文件链接。命名id为skin1和skin2,结果还是不成,alert显示skin1.href属性是null。刚才都可以的。然后写代码来比较。发现链接id的末尾是数字,那么都获取不了这个节点。
于是改名为skina和skinb。通过。
然后整理代码,归到各自链接文件里去,然后发现换肤后刷新,恢复到默认皮肤去了,没读取到cookie然后看了下变化。原来我把所有的一次运行文件都放到window.onload函数里去的。如果换肤的设置代码在这里执行始终是默认链接的皮肤。
最终代码如下。
然后js使用cookie直接双击文件,以文件的访问方式也可以测试换肤,不需要IIS架设站点来访问。
Header 部分
<link id="skina" href="Skin/default/index.css" rel="stylesheet" type="text/css">
<link id="skinb" href="Skin/default/share.css" rel="stylesheet" type="text/css">
<script src="Scripts/Lib.js" language="javascript"></script>
切换按钮
<div id="skin1" onclick="changecss('default')">默认样式</div>
<div id="skin2" onclick="changecss('blue')">蓝色样式</div>
因为我的CSS链接都是Skin/default/index.css和Skin/blue/index.css这样的变化,只是两个反斜杠中间的文件目录变化而已。
所以在setskin函数里用个正则,获取链接id的href属性,并从cookie读取文件夹名来重新设置href属性就可以了。
lib.js代码
Code
var SkinCookieName = "myskin";
setskin();
function setskin(){
var thisskin = "default";
var cookieSkin=GetCookie(SkinCookieName);
if(cookieSkin!="")
thisskin = cookieSkin;
var reg = /\/.*\//;
skina.href = skina.href.replace(reg, "/"+thisskin+"/");
skinb.href = skinb.href.replace(reg, "/"+thisskin+"/");
}
function changecss(url){
if(url!=""){
var expdate=new Date();
expdate.setTime(expdate.getTime()+(24*60*60*1000*30));//+(24*60*60*1000*30)
SetCookie(SkinCookieName,url,expdate,"/",null,false);
setskin();
}
}
SetCookie和GetCookie函数
Code
function SetCookie(name,value){
var argv=SetCookie.arguments;
var argc=SetCookie.arguments.length;
var expires=(2<argc)?argv[2]:null;
var path=(3<argc)?argv[3]:null;
var domain=(4<argc)?argv[4]:null;
var secure=(5<argc)?argv[5]:false;
document.cookie=name+"="+escape(value)+((expires==null)?"":("; expires="+expires.toGMTString()))+((path==null)?"":("; path="+path))+((domain==null)?"":("; domain="+domain))+((secure==true)?"; secure":"");
}
function GetCookie(Name) {
var search = Name + "=";
var returnvalue = "";
if (document.cookie.length > 0)
{
offset = document.cookie.indexOf(search);
if (offset != -1)
{
offset += search.length;
end = document.cookie.indexOf(";", offset);
if (end == -1)
end = document.cookie.length;
returnvalue=unescape(document.cookie.substring(offset,end));
}
}
return returnvalue;
}
总结:
1.css里不能通过import方法导入CSS,多个CSS只能加多个链接吧。
2.html页面中css链接代码命名id里不能有数字
3.js代码执行要放到链接css代码后面
4.执行代码不能放到window.onload函数里
改造原代码
Code
<HTML>
<HEAD>
<link ID="skin" rel="stylesheet" type="text/css">
<TITLE>换肤技术</TITLE>
<SCRIPT LANGUAGE=javascript>
<!--
function SetCookie(name,value){
var argv=SetCookie.arguments;
var argc=SetCookie.arguments.length;
var expires=(2<argc)?argv[2]:null;
var path=(3<argc)?argv[3]:null;
var domain=(4<argc)?argv[4]:null;
var secure=(5<argc)?argv[5]:false;
document.cookie=name+"="+escape(value)+((expires==null)?"":("; expires="+expires.toGMTString()))+((path==null)?"":("; path="+path))+((domain==null)?"":("; domain="+domain))+((secure==true)?"; secure":"");
}
function GetCookie(Name) {
var search = Name + "=";
var returnvalue = "";
if (document.cookie.length > 0) {
offset = document.cookie.indexOf(search);
if (offset != -1) {
offset += search.length;
end = document.cookie.indexOf(";", offset);
if (end == -1)
end = document.cookie.length;
returnvalue=unescape(document.cookie.substring(offset,end));
}
}
return returnvalue;
}
var thisskin;
thisskin=GetCookie("nowskin");
if(thisskin!="")
skin.href=thisskin;
else
skin.href="css.css";
function changecss(url){
if(url!=""){
skin.href=url;
var expdate=new Date();
expdate.setTime(expdate.getTime()+(24*60*60*1000*30));
//expdate=null;
//以下设置COOKIES时间为1年,自己随便设置该时间..
SetCookie("nowskin",url,expdate,"/",null,false);
}
}
//-->
</SCRIPT>
</HEAD>
<BODY>
<P>请选择下面的下拉菜单测试换肤效果</P>
<a href=# onclick="changecss('css.css')">css.css</a>
<a href=# onclick="changecss('css1.css')">css1.css</a>
<a href=# onclick="changecss('css2.css')">css2.css</a>
<a href=# onclick="changecss('css3.css')">css3.css</a>
<br>
<select onchange="changecss(this.value)">
<option>选择样式单文件</option>
<script language="javascript">
var csss=new Array();
csss[0]="css.css";
csss[1]="css1.css";
csss[2]="css2.css";
csss[3]="css3.css";
var i;
for(i=0;i<4;i++)
if(thisskin==csss[i])
document.write("<option value=\""+csss[i]+"\" selected>"+csss[i]+"样式单文件</option>");
else
document.write("<option value=\""+csss[i]+"\">"+csss[i]+"样式单文件</option>");
</script>
</select>
</BODY>
</HTML>