internet-explorer-8 - IE8 setInterval 和 setTimeout 在正常运行 49 天后立即触发

标签 internet-explorer-8 settimeout setinterval

随着 Windows 系统的正常运行时间接近 49.7 天,内部 Windows 毫秒滴答计数器接近 2^32。
在计算何时触发 setInterval 或 setTimeout 事件时,Internet Explorer 8 中的一个错误似乎存在算术溢出。例如,如果您在正常运行时间的第 49 天,并调用

setInterval(func, 86400000); // fire event in 24 hours

func 将立即被调用,而不是在 24 小时内。

如果将足够大的数字传递给 setInterval 或 setTimeout,则此错误可能会在 25 天正常运行时间(2^31 毫秒)后的任何时间发生。 (不过,我只在第 49 天检查过。)

您可以通过在命令行中输入“net statistics server”来查看正常运行天数。

有解决方法吗?

最佳答案

您可以通过使用 setTimeout 的包装器来解决该错误。

function setSafeTimeout(func, delay){
    var target = +new Date + delay;
    return setTimeout(function(){
        var now = +new Date;
        if(now < target) {
            setSafeTimeout(func, target - now);
        } else {
            func();
        }
    }, delay);
}

这仍然返回 setTimeout 的值所以如果没有遇到这个bug clearTimeout仍然可以使用。如果 clearTimeout需要防弹或者你需要setInterval (大概是 clearInterval )您需要在问题上抛出更多代码,但是在执行 func 之前验证足够时间的原则已经过去。持有。

关于internet-explorer-8 - IE8 setInterval 和 setTimeout 在正常运行 49 天后立即触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4351191/

相关文章:

javascript - jQuery 特色内容 slider ,每张幻灯片都有动画

javascript - setInterval() 是异步函数吗?

javascript - Javascript 中 for 循环内的 setInterval

jquery - IE8 中的 SlideUp() 和 SlideDown() 效果

javascript - “控制台”是 Internet Explorer 的未定义错误

javascript - 在 IE 中使用 setImmediate() 而不是 setTimeout(func,0)

Javascript - 可以检查是否已设置间隔?

java - IE8 要求在 .xls 文件上打开/保存两次

javascript - 在 IE8 中打印谷歌地图打印和使用 'page-break-before' 时出现问题

javascript - 如何在 Javascript 中创建一个 for 循环来设置数组的超时?