如果连续几秒钟没有按键,是否可以弹出警告窗口?

3
我需要知道是否在10秒内没有键盘按下或者鼠标点击操作,如果是,则显示一个警示窗口。如果使用jquery比纯js更有效率,我可以使用jquery。
该怎样实现呢?谢谢。

1
你是在询问最高效的编码过程,还是在询问运行时最高效的代码? - nnnnnn
抱歉,我不知道我想说什么。我只是在谷歌上搜索了一下,我认为这可能是运行时最有效的方法。 - lisovaccaro
3个回答

5

像这样的:

(function(){

    var timer;
    function resetTimer(){
        clearTimeout(timer);
        timer = setTimeout(function(){
            alert('No keydown for 10 seconds');   
            // Call reset timer here if you want the timer to start again
            // when the alert is closed

            // Otherwise, if you want to stop the timer forever,
            // remove the event handler from document.onkeydown
        }, 10000);
    }
    resetTimer();

    document.onkeydown = resetTimer;

})();

JSFiddle

这段代码假设您没有绑定其他内容到文档的 keydown 监听器。如果您已经绑定了其他内容,则应改用 addEventListenerattachEvent


在性能方面,为每个按键设置/清除超时是否有效?我的意思是,当有人在打字时,我们会创建/清除很多定时器。 - Li0liQ
@Li0liQ 在我的笔记本电脑上,使用Chrome浏览器,函数resetTimer()可以每秒执行约350,000次。如果有人能打字那么快,那就太可怕了:P。好处是当用户空闲时,它也处于空闲状态,而不会在用户空闲时占用(虽然很小的)CPU。 - Paul
似乎记得要求是针对按键或点击,因此您可能还需要在body上添加一个点击监听器。 - RobG

2
var seconds = 0;

window.setInterval(function() {
  seconds++;
  if(seconds == 10) {
    alert("No keydown or click in 10 seconds");
  }
}, 1000);

$('body').live('click keydown', function(e) {
  e.preventDefault();
  seconds = 0;
});

必须具备jQuery。


我编辑了这个,你将setInterval的时间设置为“1”,但计时器单位是毫秒,而不是秒,所以我将其更改为“1000”。 - Ben Lee
嗯,只是出于习惯。根据使用情况,您可以选择是否包含它 :) - Dmungara

0
  • 设置一个变量来跟踪键盘/点击事件是否发生,例如var action_happened = false;
  • 设置一个10秒的计时器(10000毫秒setTimer)。
  • 在计时器的回调函数中,如果!action_happened,则显示一个警报。
  • 设置全局点击/按键事件处理程序。它们的回调只需action_happened = true;
  • 如果您真的想追求效率,在设置action_happened = true;之后,删除点击/按键处理程序。这是可选的,即使没有这一步也足够高效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接