丁宇 | DING Yu

有趣的setTimeout和clearTimeout

今天使用我写的jQuery Countdown Plugin时,遇到一个特殊的需求:要停止正在进行的倒计时。

Google了一下,发现window.clearTimeout可以做这事儿,但要求首先获得window.setTimeout的句柄,我在写这个plugin时并没有考虑这点,又不想加个句柄变量到jQuery对象中,于是再度Google,并发现了一个window.clearTimeout的很奇怪的用法,可以自动获得句柄:

window.clearTimeout(setTimeout("0")-1);

这条语句确实能够满足我的需求,可我不明白这是什么意思,哪位高手能给解释下?

根据这个发现,我顺便更新了plugin-加了个stop()方法,详细用法和下载见这里

此外一个有趣的现象就是:在IE和FF下,window.setTimeout返回的句柄不同。在IE下,它是一个8位的数字,并且每次刷新页面时这个数字以3递增;在FF下,它是个各位的数字,并且刷新时不会有变化。


  1. 云帆飞舞 @ 2008-05-30 00:42:25 +0800:

    太谢谢,这个句柄帮了我的大忙了。这会儿别提有多高兴,特意留言!

  2. 桂荣 @ 2008-11-20 00:23:03 +0800:

    仔细研究了下,setTimeout返回的值似乎没什么规律,但紧挨着的两个setTimeout()方法返回值却是有关系的,即相差1,所以
    clearTimeout(setTimeout("0")-1)起作用。
    当然clearTimeout(setTimeout("")-1)一样起作用。

  3. 丁宇 @ 2008-11-20 00:43:18 +0800:

    @桂荣: 我又试了一下,在Mac下,无论是FF还是Safari,这个句柄都是以1为单位递增的,并且每刷新一次页面,起始数字都会不断上升,直到我关闭并重开浏览器。

    有空得研究下这个返回值究竟来自于哪里。

  4. 桂荣 @ 2008-11-20 00:49:01 +0800:

    对啊,无论刷新或者执行另外一个setTimeout,返回值就会增1,正因为1递增,所以才有了上面的方法。至于返回值来自于哪里,等你弄明白了告诉我哈,[emoticon:big_smile]

  5. 王为 @ 2009-06-18 23:10:00 +0800:

    我在自定义对象里写的setTimeout clear不掉,可能是跟作用域有关系,用了你这句柄,解决了,说声谢了

  6. 彭钰炜 @ 2009-12-09 10:12:39 +0800:

    [emoticon:angel]
    谢谢啦,虽然我是+1才clear的

  7. 吉光片羽 @ 2011-01-20 01:50:35 +0800:

    百度到你这来的,杯具的是你的代码没太看懂。。。不过取到了真谛,呵呵。

    一开始考虑用settimeout来实现,结果发现有更简单的办法,我也总是被timeout和interval给搞混去,不知道什么地方用哪个好。。。

    不过用setInterval的话,貌似代码会比你这个更短就实现了,晚点我会整理到博客,有兴趣的话还请保持关注。