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实现动态增加删除表格行(兼容IE/FF)
Apr 02 Javascript
javascript中数组array及string的方法总结
Nov 28 Javascript
web前端设计师们常用的jQuery特效插件汇总
Dec 07 Javascript
JS动态修改iframe高度和宽度的方法
Apr 01 Javascript
jquery实现兼容IE8的异步上传文件
Jun 15 Javascript
Bootstrap布局组件应用实例讲解
Feb 17 Javascript
响应式表格之固定表头的简单实现
Aug 26 Javascript
利用Angularjs和原生JS分别实现动态效果的输入框
Sep 01 Javascript
javascript入门之window对象【新手必看】
Nov 22 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
Apr 16 Javascript
JavaScript 类的封装操作示例详解
May 16 Javascript
详解Vue的sync修饰符
May 15 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
功能齐全的PHP发送邮件类代码附详细说明
2008/07/10 PHP
PHP缓冲区用法总结
2016/02/14 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
php中final关键字用法分析
2016/12/07 PHP
[原创]php实现数组按拼音顺序排序的方法
2017/05/03 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
使用jquery修改表单的提交地址基本思路
2014/06/04 Javascript
javascript抽象工厂模式详细说明
2014/12/16 Javascript
php结合imgareaselect实现图片裁剪
2015/07/05 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
js每隔两秒输出数组中的一项(实例)
2017/05/28 Javascript
Vue 项目代理设置的优化
2018/04/17 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
Swiper.js实现移动端元素左右滑动
2019/09/08 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
Python爬取国外天气预报网站的方法
2015/07/10 Python
详解supervisor使用教程
2017/11/21 Python
pandas多级分组实现排序的方法
2018/04/20 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
2020/05/26 Python
如何对python的字典进行排序
2020/06/19 Python
俄语专业毕业生求职信
2014/07/12 职场文书
小学学校门卫岗位职责
2014/08/03 职场文书
服务行业演讲稿
2014/09/02 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
会计人员岗位职责
2015/02/03 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
个人维稳承诺书
2015/05/04 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
重阳节座谈会主持词
2015/07/03 职场文书
大学生学习十八届五中全会精神心得体会
2016/01/05 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL