如何检测Javascript空闲?

时间:2009-07-29 13:40:59

标签: javascript dom browser

有没有人知道如何编写一个Javacript函数,如果浏览器的Javascript引擎在一段时间内处于空闲状态,该函数会返回true?

我很乐意使用mootools / jQuery等,如果更容易的话,稍微偏爱mootools。

编辑:

我的实际问题:我正在打电话给第三方的API。该调用立即返回,但它对DOM所做的实际工作持续了一段时间(在许多情况下为> 10秒)。我想在DOM工作完成后立即运行我的一些代码。我对我正在调用的API函数的内部一无所知,所以我一直在寻找一种确定函数是否已完成的通用方法。

5 个答案:

答案 0 :(得分:3)

如果你调用这样一个函数,假设一个空闲时间计数器存在,那么它是否会重置?

如果您可以概述您要解决的问题,可能是我们可以帮您解决。我可以想办法解决“自此函数运行以来已经存在多长时间”或“自页面上一次事件以来已有多长时间”或“如果用户已在此页面上执行X秒“,但我没有任何好的方法”只有当X秒没有发生任何事情时才这样做。“

<强>更新

根据您的更新,我会在API中寻找一个回调机制(你可以分享它是什么吗?),这样你就可以在API完成后安排一些工作。如果这不起作用,您可以尝试添加以下内容:

setTimeout( function() { myCallbackMethod(); }, 0 );

这将安排在当前执行完成后启动回调。这取决于javascript引擎是单线程的,但我已经看到它用起来效果很好。

答案 1 :(得分:0)

有两个事实可以用来衡量javascript / flash线程的空闲状态。

  1. Javascript有定时源(setTimeout, setInterval),仅在javascript空闲时才会打勾。因此,线程空闲越少,计时器就越慢。

      

    “JavaScript只能执行一个   一次一段代码(因为它   每个这些都是单线程性质的   代码块正在“阻塞”   其他异步事件的进度。   这意味着当异步时   发生事件(如鼠标点击,a   计时器触发或XMLHttpRequest   完成)它排队等候   后来执行。“   How JavaScript Timers Work

  2. Javascript有一个外部计时源,无论闲置如何都会打勾。类实例Date()基于外部时钟,您可以使用getTime()获得毫秒时序:

    var timeSinceDisco =(新日期).getTime();

  3. eJohn有一些有趣的测试using getTime() for benchmarking

    我们使用外部计时器Date.getTime()和内部时间setTimeout之间的差异来计算javascript线程的空闲程度。当然,对于像V8tracemonkey这样的性感新javascript引擎来说,这不会起作用,因为它们使用多个线程。它应该适用于目前大多数浏览器。

    Lessons from Gmail: Using Timers Effectively

答案 2 :(得分:0)

我99.4%肯定没有这样的功能,但是,我希望有,因为我真的需要它。

当然,您可以在此处构建自己的解决方案(在每个入口点函数的开头调用的函数),具体取决于详细信息。

var Tracker={ 
 last: new Date().geTime(),
 activity:function() { this.last=new Date().geTime(); },
 idle:function() { return new Date().geTime()-this.last; }
 }


...

var clickedSomething=function() {
 Tracker.activity();
 ...real code..
 }

答案 3 :(得分:0)

您可以调用一个函数来检查每个计时器间隔的鼠标X和Y位置,并将它们与上次保存的X和Y位置进行比较,如果它们相同,则它是空闲的。

MooTools Sample

答案 4 :(得分:0)

我认为这个可能很有用

https://sourceforge.net/projects/idleness/