Javascript Google Chrome上的setTimeout()存在奇怪的问题

Javascript Google Chrome上的setTimeout()存在奇怪的问题,javascript,google-chrome,settimeout,Javascript,Google Chrome,Settimeout,我在这里搜索并找到了一个快速解决方案,可以在用户在页面上空闲时调用操作。它基本上可以在所有浏览器上正常工作 但当我在页面上使用警告或确认对话框时,谷歌Chrome就会出现奇怪的问题 警报或确认框消失(按下OK、Cancel或Cross)后,怠速功能意外工作 在确认框或警报框消失后(来自链接的onclick),我立即得到了“3秒过去”框 在FF、IE和Chrome(最新)上测试。它只发生在Chrome上 我的代码在这里: 当我把这个代码放在我的页面上时,它就像一个符咒。 我打开页面,做一些鼠

我在这里搜索并找到了一个快速解决方案,可以在用户在页面上空闲时调用操作。它基本上可以在所有浏览器上正常工作

但当我在页面上使用警告或确认对话框时,谷歌Chrome就会出现奇怪的问题

警报或确认框消失(按下OK、Cancel或Cross)后,怠速功能意外工作

  • 在确认框或警报框消失后(来自链接的onclick),我立即得到了“3秒过去”框
在FF、IE和Chrome(最新)上测试。它只发生在Chrome上

我的代码在这里:

当我把这个代码放在我的页面上时,它就像一个符咒。 我打开页面,做一些鼠标动作或不做,然后3秒钟不移动鼠标,我得到空闲警报。这就是我需要的

当我放置一个简单调用警报框的链接并单击它时,警报框就会出现。 然后我关上盒子,我得到空闲警报,它是“3秒过去了”

    <a onclick="if(confirm( 'Are you OK?' )) { alert('Nice.') } else { return false; };">First Link!</a>
    <a onclick="alert('An alert.');" >Second Link!</a>
第一个链接!
第二个链接!
它只出现在谷歌浏览器上。有了IE和FF,一切都很好。
增加超时时间,什么都不会改变。

如果您在解除警报或确认后立即收到该框,这并不奇怪,这是正常的<代码>确认和
警报
完全停止JavaScript执行。下一次对计时器的调用将排队等待解释器再次可用,因此取消显示消息的框并不让我感到惊讶。这是你看到的唯一一个有问题的行为吗?

“…空闲函数出乎意料地工作。”出乎意料的是怎么回事?!?!欢迎来到StackOverflow。与其他一些站点不同,StackOverflow的目标之一是独立运行。尽一切可能像你做的那样链接到方便的实时示例,但是在你的问题中包括你正在使用的代码(这就是为什么易江为你复制了它)。链接腐烂可以很容易地发生(外部资源被删除、重命名等),此外,如果人们能够从问题本身看出问题的症结所在,就不必去其他地方。玩得开心@T.J.克劳德,基本上,绿巨人粉碎+1=D@David:…绿巨人…粉碎?我在我们的应用程序中遇到了同样的问题;每当发生
警报
时,我们的计时器都会立即启动。看起来像是一个Chrome bug。问题是,如果你立即单击第二个链接,并立即关闭警报框,则会出现第二个警报框,其中包含“3秒已过”,即使你在不到3秒的时间内完成了所有操作。。。(这个评论可以理解吗?@Crowder-IE/FFX是否会在出现警报/确认框时抑制setTimeout“线程”,而Chrome只是继续“线程”?(请原谅我的懒惰——没有时间在我的机器上验证。)@Golmote:是的。增加超时时间后,不会发生任何更改。3秒只是为了测试。@DashK:他们如何实现它取决于他们,前提是当调用
警报
确认
时,没有任何其他与页面相关的JavaScript运行。@egon:我使用Chrome for Linux得到一个更奇怪的结果:如果我单击第一个链接并按Enter键关闭
确认
,然后再次输入以解除
警报
,我不仅会立即收到“3秒”警报,而且通过键盘解除警报会立即再次显示。只要我用键盘关闭警报,这种情况就会持续发生。如果我使用鼠标关闭“3秒”警报,则会立即停止序列(或者在几次迭代内)。你也会这样吗?
jQuery(document).ready(function() {
    var idleDuration;
    jQuery(document).mousemove(function() {
        if (idleDuration) {
            clearTimeout(idleDuration);
            idleDuration = 0;
        }

        idleDuration = setTimeout(function() {
            someIdleAction();
            window.location = 'some url';
        }, 3000)
    })
});
    <a onclick="if(confirm( 'Are you OK?' )) { alert('Nice.') } else { return false; };">First Link!</a>
    <a onclick="alert('An alert.');" >Second Link!</a>