这是〈锋利的JQ〉里的第二章实例,首先,看效果:如图:
默认状态:隐藏
单击按钮显示更多。
很简单的效果,先看结构:
<style type="text/css">
*{ margin:0; padding:0;}
body{ font-size:12px; text-align:center;}
a{ color:#04d; text-decoration:none;}
a:hover{ color:#f50; text-decoration:underline;}
.SubCategoryBox{ width:600px; margin:0 auto; text-align:center; margin-top:40px;}
.SubCategoryBox ul{list-style:none;}
.SubCategoryBox ul li{ float:left; width:200px; line-height:20px;}
.showmore{ clear:both; text-align:center; padding-top:10px; zoom:1;}
.showmore a{ display:block; width:120px; margin:0 auto; line-height:24px; border:1px solid #aaa;}
.showmore a span{ padding-left:15px; background:url(images/down.gif) no-repeat;}
.promoted a{ color:#f50;}
</style>
</head>
<body>
<div class="SubCategoryBox">
<ul>
<li class="test"><a href="#">佳能</a><i>(30440) </i></li>
<li><a href="#">索尼</a><i>(27220) </i></li>
<li><a href="#">三星</a><i>(20808) </i></li>
<li><a href="#">尼康</a><i>(17821) </i></li>
<li><a href="#">松下</a><i>(12289) </i></li>
<li><a href="#">卡西欧</a><i>(8242) </i></li>
<li><a href="#">富士</a><i>(14894) </i></li>
<li><a href="#">柯达</a><i>(9520) </i></li>
<li><a href="#">宾得</a><i>(2195) </i></li>
<li><a href="#">理光</a><i>(4114) </i></li>
<li><a href="#">奥林巴斯</a><i>(12205) </i></li>
<li><a href="#">明基</a><i>(1466) </i></li>
<li><a href="#">爱国者</a><i>(3091) </i></li>
<li><a href="#">其它品牌相机</a><i>(7275) </i></li>
</ul>
<div class="showmore">
<a href="#"><span>显示全部品牌</span></a>
</div>
</div>
</body>
再看JQ代码:
$(function(){
var $category = $(\'ul li:gt(5):not(:last)\');
$category.hide();
var $toggleBtn = $(\'div.showmore > a\');
$toggleBtn.click(function(){
if($category.is(":visible")){
$category.hide();
$(\'.showmore > a span\').css("background","url(images/down.gif) no-repeat")
.text("显示全部品牌");
$(\'ul li\').removeClass("promoted");
}else{
$category.show();
$(\'.showmore a span\')
.css("background","url(images/up.gif) no-repeat 0 0")
.text("精简显示品牌");
$(\'ul li\').filter(":contains(\'佳能\'),:contains(\'尼康\'),:contains(\'奥林巴斯\')")
.addClass("promoted");
}
return false;
})
})
JQ很简单不解释,接下来,是我的JS仿写。
从效果和JQ代码中,我们都可以总结出实现这功能的思路出来:
1.获取第7个li到倒数第二个li,隐藏之。
2.获取按钮a元素,单击时显示更多,并修改按钮样式和给一些内容添加样式。
直接看代码吧:
window.onload = function(){
var list = document.getElementsByTagName(\'li\'); //获取页面上的li
var btn = getElementsByClassName(\'showmore\')[0].getElementsByTagName(\'a\')[0]; //获取按钮a
var span = btn.getElementsByTagName(\'span\')[0]; //获取a里面的span
var flag = true; //用以控制显示和隐藏切换
showHidden(list,\'none\'); //一个显示隐藏函数,由于多次出现,所以弄成函数
btn.onclick = function(){
if(flag){
showHidden(list,\'block\'); //单击时,显示出隐藏内容
for(var i = 0,l = list.length; i < l; i++){ //遍历所有内容,寻找匹配的内容,添加样式
var str = list[i].innerHTML;
if(str.indexOf("佳能") != -1 || str.indexOf("尼康") != -1 || str.indexOf("奥林巴斯") != -1){
addClass(\'promoted\',list[i]);
}
}
span.innerHTML = "精简显示品牌"; //改变内容
span.style.background = "url(images/up.gif) no-repeat";
flag = false;
}else{
showHidden(list,\'none\');
for(var i = 0,l = list.length; i < l; i++){
var str = list[i].innerHTML;
if(str.indexOf("佳能") != -1 || str.indexOf("尼康") != -1 || str.indexOf("奥林巴斯") != -1){
removeClass("promoted",list[i]); //移除样式
}
}
span.innerHTML = "显示全部品牌";
span.style.background = "url(images/down.gif) no-repeat";
flag = true;
}
}
}
function showHidden(list,type){ //显示隐藏函数
for(var i = 6, l = list.length - 1; i < l; i++){
list[i].style.display = type;
}
}
function getElementsByClassName(className,node){ //通过类名获取对象
node = node || document;
if(node.getElementsByClassName){
return node.getElementsByClassName(className);
}
var eles = node.getElementsByTagName(\'*\');
var reg = [];
for(var i = 0,l = eles.length; i < l; i++){
if(hasClass(className,eles[i])){
reg.push(eles[i]);
}
}
return reg;
}
function hasClass(className,node){ //判断对象节点是否有某个类
var eles = node.className.split(/\s+/);
for(var i = 0,l = eles.length; i < l; i++){
if(eles[i] == className){
return true;
}
}
return false;
}
function addClass(className,node){ //添加样式
return node.className += " " + className;
}
function removeClass(className,node){ //删除样式
eles = node.className.split(/\s+/);
for(var i = 0,l = eles.length; i < l; i++){
if(eles[i] == className){
eles.splice(i,1);
}
}
node.className = eles.join(" ");
return node;
}