经测试运行ok,可以直接复制,有问题的话大家可以指出来交流一下。
不是,这句话的意思是当存在这个定时器的时候,就把这个定时器清除掉。具体意思就是,当你的鼠标在一个标题上停留不超过500ms的时候,又停留到了另一个标题上,那么之前标签上的定时执行的内容就会被清除掉,那个标题就不会高亮显示了。你可以把if(timer)换成if(false)试一下,就看出不同了。
把第二句括号里面的引号去掉只留id
display:block
function $(id){ return typeof id==='string'?document.getElementsById(id):id; }
$ 函数名。
id 参数
如果传入的id是字符串类型的。返回 document.getElementById(id)
因为timer接收到的是setTimeout返回的一个整数类型的值,clearTimeout()是根据这个值去清除计时器,计时器清除后timer变量的值依旧不变,所以最好重新赋值为NULL;setInterval也是同样道理
亲我刚了你的代码虽然这么晚了而且时间过了这么久!但还是来回答一下您的问题
开始的时候你所有的内容都隐藏掉了,您应该显示一个
您应该给每一个li添加一个onmouseover事件所以应该写成list[i].onmouseover=function () {//...}
是style.display = "block" 而不是display.style = "block"
这句话的意思是动态给每个li元素添加id并给每个id增值为i.
比如:给第一个li元素lis[0]加个id="0",给第二个li元素lis[1]加个id="1",以此类推......希望能帮到你!加油!!
首先,制作这个功能就是为了实现延迟的效果(延迟了半秒),不会让鼠标一滑到上面就立即切换
另外,这个时间不一定是500ms,但是500ms是比较好的一个反应时间既不会让用户感觉太慢,也不会太突兀
tiemer=setTimeout();这个一定要注意了,这个函数和clearTimeout();一般都是成对出现的,这个计时器不用的时候是最好给他清除的,不然鼠标移动太快会出现问题的,timer开始时为null,后面我们调用了tiemer=setTimeout();这个时候timer就不在是null,也就是说这个计时器被调用了,我们鼠标移动到下一个选项卡时,一定要把之前的计时器删除干净,这个时候只要判断timer不是null了,就把计时器删了就可以了。
这个没有用的,估计开始的时候准备用Index存取索引值的,也就是后面that=this的时候你可以用:index=this.id来获取索引
不加对你的代码也没影响
我做了我的可以。你前面既然that可以用证明基本上是对的。可能就是一个没注意的地方。F12控制台报错看看是第几行。我的布局和老师的不一样。代码不同。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>tab切换</title>
<style type="text/css">
*{margin: 0px;padding: 0px;list-style:none;font-size: 16px;}
.tab{margin: 50px auto;position: relative;width: 600px;height:98px;overflow: hidden;border: 1px solid #ccc;}
.notice1{width: 600px;height:27px;}
.notice1 li{width: 118px;height: 27px;text-align: center;background: #f7f7f7;float: left;border-bottom: 1px solid #eee;line-height: 27px;padding: 0 1px}
.notice1 li a,.notice2 li a{text-decoration: none;color: #000}
.notice1 .select{background: #fff;border-bottom: 1px solid #fff;border-left: 1px solid #eee;border-right: 1px solid #eee ;padding: 0px 0px;font-weight:bold;}
.notice2 li{float: left;margin:7px 10px;width: 280px;text-align: center;}
</style>
</head>
<body>
<div id="tab" class="tab">
<ul id="notice1" class="notice1">
<li><a href="">公共</a></li>
<li><a href="">规则</a></li>
<li><a href="">论坛</a></li>
<li><a href="">安全</a></li>
<li class="select"><a href="">公益</a></li>
</ul>
<ul class="notice2" style="display:none">
<li><a href="">公共厕所公关广告公关广告</a></li>
<li><a href="">公共厕所公关广告公关广告</a></li>
<li><a href="">公共厕所公关广告公关广告</a></li>
<li><a href="">公共厕所公关广告公关广告</a></li>
</ul>
<ul class="notice2" style="display:none">
<li><a href="">规则厕所公关广告公关广告</a></li>
<li><a href="">规则厕所公关广告公关广告</a></li>
<li><a href="">规则厕所公关广告公关广告</a></li>
<li><a href="">规则厕所公关广告公关广告</a></li>
</ul>
<ul class="notice2" style="display:none">
<li><a href="">论坛厕所公关广告公关广告</a></li>
<li><a href="">论坛厕所公关广告公关广告</a></li>
<li><a href="">论坛厕所公关广告公关广告</a></li>
<li><a href="">论坛厕所公关广告公关广告</a></li>
</ul>
<ul class="notice2" style="display:none">
<li><a href="">安全厕所公关广告公关广告</a></li>
<li><a href="">安全厕所公关广告公关广告</a></li>
<li><a href="">安全厕所公关广告公关广告</a></li>
<li><a href="">安全厕所公关广告公关广告</a></li>
</ul>
<ul class="notice2" style="display:block">
<li><a href="">难难厕所公关广告公关广告</a></li>
<li><a href="">难难厕所公关广告公关广告</a></li>
<li><a href="">难难厕所公关广告公关广告</a></li>
<li><a href="">难难厕所公关广告公关广告</a></li>
</ul>
</div>
</body>
<script type="text/javascript" >
window.onload=function(){
var timer=null;
var onotice1 = document.getElementById("notice1");
var oli = onotice1.getElementsByTagName("li");
var otab = document.getElementById("tab");
var oul = otab.getElementsByTagName("ul");
for (var i = 0;i<oli.length; i++) {
oli[i].index=i+1;
oli[i].onmouseover=function(){
var that=this
clearTimeout(timer);
timer=setTimeout(function(){
for (var j= 0; j<oli.length; j++) {
oli[j].className="";
oul[j+1].style.display="none";
};
that.className="select";//设置当前鼠标经过的li添加class.
oul[that.index].style.display="block";
},500)
}
}
}
</script>
</html>
声明变量初始化为0;
定义的timer=null啊,第一次索引赋的值然后就是空
function $(id){ return typeof id==='string'?document.getElementsById(id):id; }
$ 函数名。
id 参数
如果传入的id是字符串类型的。返回 document.getElementById(id)
你的代码里document.getElementByid 写错了。多了个s
如果不是 直接返回 id
node.onlick=function(){
this;
timer=setTimeout(function(){
this;
},500);
}
例如上面这例子,第一个this 与 第二个 this 是不同的;
第一个 this:指的是node这个对象;
第二个 this:指的是setTimerout()这个对象;
如果在第一个this后面加上代码 var that=this;
就是说把node对象赋给that,此时that可以随意引用了;
在window.onload=function(){}里面声明的变量都是全局变量,唯一区别的是该变量是在文档结构加载完毕后执行。所以,并非是你所理解的写在function外面就是全局变量。
好像有没有无所谓 我试过了没发现问题
哈,我刚做完这个,没有出现此情况。你是不是li宽设置过头了?注意padding这些属性
var time = null ;这个是声明变量(显示声明)
time = null (隐式声明)
声明变量避免变量污染,减少代码冗余
童鞋你好,你说的是jQuery里的选择器哦。
如果你仔细看,你会发现$()方法是在js开始时自定义的一个方法,不是jQuery里那个方法哦~
<script>
function $(id) {
return typeof id === "string" ? document.getElementById(id) : id;
}
window.onload = function() {
//标签的索引
var timer = null;
var lis = $("notice-tit").getElementsByTagName("li");
var divs = $("notice-con").getElementsByTagName("div");
if (lis.length != divs.length) return;
for (var i = lis.length - 1; i >= 0; i--) {
//遍历所有的页签
lis[i].id = i;
lis[i].onmouseover = function() {
//用that这个变量引用当前滑过的li
var that = this;
//如果存在准备执行的定时器,立刻清除,只有当停留时间大于500ms时才开始执行
if (timer) {
clearTimeout(timer);
timer = null;
}
//延迟半秒执行
timer = setTimeout(function() {
for (var j = 0; j < lis.length; j++) {
lis[j].className = "";
divs[j].style.display = "none";
}
lis[that.id].className = "select";
divs[that.id].style.display = "";
}, 500);
}
};
}
</script>
我按教程中的试验,没有bug。每次onmouseover事件触发时,都会清除一下定时器的。你检查下你写的代码,应该是你自己漏写了。
由于this.id中的this在定时器里面会指向window,所以我们就不能使用this.id来索引了,所以就定义一个index的变量来索引,就是使标题和内容能够一一对应