小看了setTimeout().

  
  

今天做项目时,有一个这样的需求,需要动态删除的Tab,比如:可以删除某一个,可以删除多个。

每一个Tab对应一个iframe。

本来我的代码是这么写的:

//...前面代码省略

eqdiv.children("iframe")[0].contentWindow.location.replace("about:blank");
eqdiv.remove();

//...后面代码省略

上面的代码可以实现删除。但我突然奇思妙想,给remove()来个setTimeout吧,自己的内心总觉得延迟个50毫秒执行好些,于是把代码改为:

//...前面代码省略

setTimeout(function(){

      eqdiv.children("iframe")[0].contentWindow.location.replace("about:blank");
      eqdiv.remove();

},50);

//...后面代码省略

改了后,当时也没仔细测试,后来终于被测试员找出问题,夜晚2点被叫到公司找bug。。。

于是我慢慢找bug,发现有如下情况:

在单独关闭一个Tab时,没有问题。

在同时关闭多个Tab时,问题来了。于是我对删除Tab的代码进行了一句句调试,终于找出问题所在。

最终代码还是之前的:

//...前面代码省略

      eqdiv.children("iframe")[0].contentWindow.location.replace("about:blank");
      eqdiv.remove();

//...后面代码省略

之后仔细一想,的确setTimeout在做循环删除时,会有问题。

举个很简单的例子:

var a = $("#t");
$("<p>1</p>").appendTo(a);
setTimeout(function(){
     $("<p>2</p>").appendTo(a);
},500);
$("<p>3</p>").appendTo(a);

运行结果肯定是: 1   , 3 , 2

但我脑子里 当时 怎么就忘记setTimeout() 的这个特性了呢  , 循环时真的要注意啊 。




作者:admin
时间:2009-10-22
标签:setTimeout
评论:8
查看:2254

如果你有什么好文章,请与我们分享。cssrain[at]gmail.com    我要投稿

为了使你得到本站最新信息,建议你订阅本站。点击此处订阅

广告也精彩:

  • 1
abin [2009-12-03 01:06 PM]
按道理来说 是等待500毫秒才执行的啊...
seekarmor [2009-11-08 05:36 PM]
实在看不懂,你要讲什么?没碰到过类似的问题,能再说的明白一些吗?
babe0555 [2009-11-04 10:55 PM]
有些人为了好看经常做一些多余的事情。几天给一个同事调试问题,有一个修改窗口死活无法弹出。早晨还还用的。最后发现今天上午他给浏览器装了一个插件,过滤弹出页面。。。
亦歌博客 [2009-10-28 05:06 PM]
setTimeout好像要和clearTimeout结合起来用。
zhenglinshuang [2009-10-23 03:10 PM]
看不懂,setTimeOut是异步没错,前面的是什么问题
fishout [2009-10-22 12:22 AM]
电信行业都是如此
admin [2009-10-22 11:24 AM]
asiainfo.com
chenai1112 [2009-10-22 10:55 AM]
admin 什么公司呀??
想知道,夜里两点改bug,点击量很大呀!
  • 1

发表评论

虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.

必须

游客发言不需要密码.

=1+5

注:长时间未操作页面,验证码会失效。