JQuery 网站换肤功能实现代码


Posted in Javascript onNovember 02, 2009

从那以后,我找到了很多可以让访客通过鼠标点击某个地方切换样式表的方法。但最近我要写一篇如何 使用jQuery编写简单代码实现它的教程。
我将向你们逐步解说整个的过程,不仅仅因为要展示jQuery代码的简介,同时也要揭示jQuery库中的若干高级特性。
首先,代码

$(document).ready(function() { 
$('.styleswitch').click(function() 
{ 
switchStylestyle(this.getAttribute("rel")); 
return false; 
}); 
var c = readCookie('style'); 
if (c) switchStylestyle(c); 
}); 
function switchStylestyle(styleName) 
{ 
$('link[@rel*=style][title]').each(function(i) 
{ 
this.disabled = true; 
if (this.getAttribute('title') == styleName) this.disabled = false; 
}); 
createCookie('style', styleName, 365); 
}

其他这里没有提到的部分是你将在后面看到的创建和读取cookie的函数。
熟悉的开篇

$(document).ready(function(){ $('.styleswitch').click(function()……告诉jQuery“以最快的速度查找所有包含对象名‘styleswitch'的元素,并在他们被鼠标点击时执行一个函数”。
看起来不错。当鼠标点击预先指定的元素时,switchStylestyle函数将被调用。从现在开始是重点。
这句话什么意思?
第一次看到这句代码的时候我的脑子有些卡壳:
$('link[@rel*=style]').each(function(i) {
在互联网上搜索了一下后我空手而归。最后不得不找到了jQuery的作者John Resig,向他咨询。
他直接给了我一个jQuery网站的页面地址,里面讲解了若干jQuery提供的高级特性(xpath),可以用来查找并操作页面中的若干元素。
如果你看过这些东西你就能明白上面那句神秘的代码的含义是告诉jQuery“查找所有带rel属性并且属性值字符串中包含‘style'的link链接元素”。
让我们看看如何编写包含一个主样式表,两个备用样式表的页面:
<link rel="stylesheet" type="text/css" href="styles1.css" title="styles1" media="screen" /><link rel="alternate stylesheet" type="text/css" href="styles2.css" title="styles2" media="screen" /><link rel="alternate stylesheet" type="text/css" href="styles3.css" title="styles3" media="screen" />我们可以看到所有样式表都含有一个包含‘style'字串的rel属性。
所以结果一目了然,jQuery轻松定位了页面中的样式表链接。
下一步?
each()函数将遍历所有这些样式表链接,并执行下一行中的代码:
this.disabled = true;if (this.getAttribute('title') == styleName) this.disabled = false;“首先禁用所有的样式表链接,然后开启任何title属性值与switchStylestyle函数传递过来的字串相同的样式表”
一把抓啊,不过很有效。
现在我们需要保证的是那些样式表存在并且有效。
完整代码和演示
既然 Kelvin Luck已经编写了这些代码,我就不在这里重复了。
DEMO
我相信Kelvin的灵感是从 这个网站那里得到的,我们正好可以看看使用其他工具实现这个功能是否要比jQuery更加复杂冗长。
完整的styleswitch.js

/** 
* Styleswitch stylesheet switcher built on jQuery 
* Under an Attribution, Share Alike License 
* By Kelvin Luck ( http://www.kelvinluck.com/ ) 
**/ 
(function($) 
{ 
$(document).ready(function() { 
$('.styleswitch').click(function() 
{ 
switchStylestyle(this.getAttribute("rel")); 
return false; 
}); 
var c = readCookie('style'); 
if (c) switchStylestyle(c); 
}); 
function switchStylestyle(styleName) 
{ 
$('link[@rel*=style][title]').each(function(i) 
{ 
this.disabled = true; 
if (this.getAttribute('title') == styleName) this.disabled = false; 
}); 
createCookie('style', styleName, 365); 
} 
})(jQuery); 
// cookie functions http://www.quirksmode.org/js/cookies.html 
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 var 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; 
} 
function eraseCookie(name) 
{ 
createCookie(name,"",-1); 
} 
// /cookie functions
Javascript 相关文章推荐
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
Dec 16 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
Sep 04 Javascript
jQuery如何获取同一个类标签的所有值(默认无法获取)
Sep 25 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
Nov 04 Javascript
javascript中slice(),splice(),split(),substring(),substr()使用方法
Mar 13 Javascript
浅谈移动端之js touch事件 手势滑动事件
Nov 07 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
Mar 27 Javascript
初探JavaScript 面向对象(推荐)
Sep 03 Javascript
vue项目打包后打开页面空白解决办法
Jun 29 Javascript
JQuery使用数组遍历跳出each循环
Sep 01 jQuery
vue实现div可拖动位置也可改变盒子大小的原理
Sep 16 Javascript
Vue实现下拉加载更多
May 09 Vue.js
Javascript结合css实现网页换肤功能
Nov 02 #Javascript
cnblogs csdn 代码运行框实现代码
Nov 02 #Javascript
键盘 keycode的值 javascript时触发事件时很有用的要素
Nov 02 #Javascript
js 函数的执行环境和作用域链的深入解析
Nov 01 #Javascript
提高网站性能之 如何对待JavaScript
Oct 31 #Javascript
JavaScript Sort 表格排序
Oct 31 #Javascript
DOM 脚本编程中的兄弟节点
Oct 31 #Javascript
You might like
西德产收音机
2021/03/01 无线电
php 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
php动态函数调用方法
2015/05/21 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
doctype后如何获得body.clientHeight的方法
2007/07/11 Javascript
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
js日期、星座的级联显示代码
2014/01/23 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
2014/01/26 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
js文字横向滚动特效
2015/11/11 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
12个非常实用的JavaScript小技巧【推荐】
2016/05/18 Javascript
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
vue增加强缓存和版本号的实现方法
2019/05/01 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
浅谈python中的占位符
2017/11/09 Python
python 初始化一个定长的数组实例
2019/12/02 Python
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
美国在线家居装饰店:Belle&June
2018/10/24 全球购物
外语系毕业生自荐信范文
2013/12/16 职场文书
大学生志愿者感言
2014/01/15 职场文书
社区七一党员活动方案
2014/01/25 职场文书
2014三八妇女节活动总结
2014/03/01 职场文书
施工员岗位职责
2014/03/16 职场文书
预备党员转正考核材料
2014/06/03 职场文书
大学国际贸易专业自荐信
2014/06/05 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
教师师德表现自我评价
2015/03/05 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
react合成事件与原生事件的相关理解
2021/05/13 Javascript