本文介绍如何使用JavaScript结合定时器实现选项卡的延时切换效果。核心技巧在于解决setTimeout中this指向问题,通过定义that变量保存当前上下文指针。代码包含完整的HTML结构与CSS样式,演示了如何判断并清除已有定时器以避免冲突,适合前端开发者参考学习。
JavaScript选项卡延时切换实现
本文分享了一段JavaScript实现选项卡切换的具体代码示例,供读者参考学习。
实现延时切换的关键在于设置定时器,此处设定延时时间为0.5秒。一个重要的编程技巧是预先定义一个变量that来保存当前的this指针。
之所以不能直接在回调函数中使用this,是因为setTimeout属于window对象的方法,此时内部的this会指向定时器本身而非当前元素。因此,需要在外部先定义一个变量来保存正确的上下文。此外,在调用新的定时器之前,务必检查并清除可能存在的旧定时器,以防止逻辑冲突。
最终运行效果如图所示:

具体实现代码如下:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>延时切换</title>
<style type="text/css">
*{margin: 0;padding: 0;font: normal 12px "微软雅黑";color: #000000;}
ul{list-style-type: none;}
a{text-decoration: none;}
#tab-list{width: 275px;height: 190px;margin: 20px auto;}
#ul1{border-bottom: 2px solid #8B4513;height: 32px;}
#ul1 li{display: inline-block;width: 60px;line-height: 30px;text-align: center;
border: 1px solid #999;border-bottom: none;margin-left: 5px;}
#ul1 li:hover{cursor: pointer;}
#ul1 li.active{border-top: 2px solid #8B4513;border-bottom: solid 2px #ffffff;}
#tab-list div{border: 1px solid #7396B8;border-top: none;}
#tab-list div li{height: 30px;line-height: 30px;text-indent: 8px;}
.show{display: block;}.hide{display: none;}
</style>
<script type="text/javascript">
window.onload=function(){
var ul1=document.getElementById('ul1');
var aLi=ul1.getElementsByTagName('li');
var oDiv=document.getElementById('tab-list');
var aDiv=oDiv.getElementsByTagName('div');
var timer=null;
for(var i=0;i<=aLi.length;i++){
aLi[i].id=i;
aLi[i].onmouseover=function(){
var that=this;//用that这个变量来引用当前滑过的li
//如果存在准备执行的定时器,立即清除,只能当前停留时间大于500ms时才开始执行(指鼠标快速滑过一个的那一瞬间要清除掉产生的定时器)
if(timer){
clearTimeout(timer);
timer=null;
}
//延时半秒执行
timer=window.setTimeout(function(){
for(var i=0;i<aLi.length;i++){
aLi[i].className="";
aDiv[i].className="hide";
}
that.className="active";//之所以不能在这直接引用this是因为setTimeout是window对象,用this的话会指向定时器,所以要在前面定义一个变量
aDiv[that.id].className="show";
},500);
}
}
}
</script>
</head>
<body>
<div id="tab-list">
<ul id="ul1">
<li class="active">房产</li><li>家居</li><li>二手房</li>
</ul>
<div>
<ul>
<li><a href="javascript:;">275万购昌平邻铁三居 总价20万买一居</a></li>
<li><a href="javascript:;">200万内购五环三居 140万安家东三环</a></li>
<li><a href="javascript:;">北京首现零首付楼盘 53万购东5环50平</a></li>
<li><a href="javascript:;">京楼盘直降5000 中信府 公园楼王现房</a></li>
</ul>
</div>
<div class="hide">
<ul>
<li><a href="javascript:;">40平出租屋大改造 美少女的混搭小窝</a></li>
<li><a href="javascript:;">经典清新简欧爱家 90平老房焕发新生</a></li>
<li><a href="javascript:;">新中式的酷色温情 66平撞色活泼家居</a></li>
<li><a href="javascript:;">瓷砖就像选好老婆 卫生间烟道的设计</a></li>
</ul>
</div>
<div class="hide">
<ul>
<li><a href="javascript:;">通州豪华3居260万 二环稀缺2居250w甩</a></li>
<li><a href="javascript:;">西3环通透2居290万 130万2居限量抢购</a></li>
<li><a href="javascript:;">黄城根小学学区仅260万 121平70万抛!</a></li>
<li><a href="javascript:;">独家别墅280万 苏州桥2居优惠价248万</a></li>
</ul>
</div>
</div>
</body>
</html>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。