《锋利的JS》 之 单击显示隐藏
这是〈锋利的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;
}
浙公网安备 33010602011771号