setTimeout “不执行”和异步

 

前两天一直在做一个效果,想法很简单,就是希望能够在网页加载后导航项能够动态弹出,以下是代码:

window.οnlοad=init;

function init(){
var alink =null;
alink = document.getElementById("nav").getElementsByTagName("A");
for(var i=0;i<alink.length;++i)
{
var mar = 35;
var time1=null;
while(mar > 0)
{
time1=window.setTimeout("",15); //希望在此延迟15ms,但
此处不执行,直接跳过
mar=mar-5;
alink[i].style.marginTop=""+mar+"px";
}
}
}

然而非常遗憾,执行至time1=window.setTimeout("",15);并没有产生预想中的延迟,而被直接跳过。我做了很多次尝试,不断的修改,纠结了几天还是不行,于是我就向网上求助。根据网上的意见,说是所执行语句不能为空,需要给他一个事件,ok,那我们就给他一个事件(其实我先前也这么尝试过)。将function(){mar=mar-5;}插入分号中。再度执行,产生了死循环,浏览器崩溃。跟踪之后mar值一直不变,也就是说函数没有执行。于是我也崩溃了。

网上回复给了我个例子,给了我看了一下,能跑。可是他的效果跟我想要的还是有一些出入,他大概就用了一种类似递归掉用的方法来去掉了循环语句。我不知道为什么这样做能行,还是试着照此方法改了。可是当我根据他的例子进行修改之后,同样的问题出现了,setTimeout的语句部分还是没能执行。我继续纠结。

自习的时候拿书翻了一下(先前没想到要到书上去找),然后很意外的让我看到了答案,然后我就眼泪盈眶,为什么不去先翻书??

书上说了,setTimeout()方法的第一个参数是一个闭包,它指定了要运行的函数。它的第二个参数是一个数值,表示的是以毫秒计算的运行延时。注意传递给setTimeout()的第一个参数也可以是表示执行代码的字符串,如果是字符串,那么setTimeout()方法会调用Function对象将这个字符串构造成函数执行。

setTimeout及setinterval都是异步执行的函数,就是它会在触发事件发生(延迟时间)之后去执行调用事件,这个过程并不会中断顺序执行的过程,而不是象c语言中的delay一样,延迟的是顺序执行的过程。而该过程大概是开启了另外的一个线程,而的具体的我也还不懂。

于是根据理解我做出了如下修改,总算解决了:

window.οnlοad=init(mar,i); function init(mar,i) { if(mar>0) { alink[i].style.marginTop=mar+"px"; mar-=5; setTimeout("init("+mar+","+i+")",50); } else{ i++; mar=35; if(i+1>alink.length){ return 0; } setTimeout("init("+mar+","+i+")",50); } }

事后我也有了一点点感想,我以为我知道dom结构,熟悉css,理解程序控制就基本能使用js了,不必再去细看什么的,真正动起手来才发现问题多多,一个不到50行的小程序就把我纠结了几天。发现问题没有从最根本的理解上去寻找根源,而是盲目的尝试,而忽视了基础。我发贴的时候说我是新手,那是我为我是有点小谦虚。绕了几个弯之后我才发现,原来我,真是个新手.

(相关代码和回复见http://topic.csdn.net/u/20100407/13/567b6aa8-b3a1-4bd0-a84b-c3f574ed6802.html)

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值