JavaScript检测用户是否正在浏览页面

5

目前我的网站每隔10秒钟就会自动重新加载一个JavaScript函数,方法是通过setInterval( "checklatestmsgidLive();", 10000 );。我认为即使用户在其他选项卡上查看其他网站,该函数仍将保持重新加载状态。如何让它只在用户查看我的网站时重新加载函数?JavaScript能否检测到用户是否正在查看我的网站?

我发现Facebook的墙壁只有当我正在查看页面时才更新新帖子,当我在其他选项卡上时,它不会更新新帖子。如何做到这一点?


1
抱歉,我感到内疚(T_T)。 - zac1987
1
不要感到内疚,这可能发生在任何人身上。我很惊讶其他人都不在意,而有些人有机会通过再次回答获得一些声望。有时候我喜欢 Stack Overflow... 有时候不喜欢。 - Lazarus
3个回答

8
在没有鼠标的触摸设备上,鼠标移动功能并不是很好用,但我们目前没有太多选择。W3C正在开发一个新的API:页面可见性。它仍处于非常早期的阶段,我能找到的唯一已经开始实施它的浏览器是Google Chrome(Dev Channel)和Internet Explorer 10 Platform Preview。
由于规范仍处于草案阶段,属性和事件都有供应商前缀。但它仍然有效,并且Chrome具有极快的更新速度。因此,我建议检测页面可见性是否可用,如果不行则退而求其次使用鼠标移动hack。
IE团队有一个实时演示, 可在Chrome Dev和IE 10平台预览中运行。

8
var tId, idleTimer;
function initReload() { 
  clearInterval(tId);
  tId = setInterval(checklatestmsgidLive, 10000 );

}
window.onload=window.onfocus=function() {
  initReload()
}
window.onblur=function() {
  clearInterval(tId);
}
window.onmousemove=function() {
  clearTimeout(idleTimer);
  idleTimer = setTimeout(function() { clearInterval(tId);},600000); // idle for 10 minutes
}

我明白了。所以我只需要window.onblur。非常感谢。请问为什么您将clearInterval(tId);放在initReload()函数内部?我猜如果您不这样做,效果仍然相同(setInterval将从第0秒开始)。 - zac1987
我把它放在onfocus重新加载的情况下。这只是一种防御性措施,但并不是真正必要的。 - mplungjan
@Zac,我按照Chris的建议添加了一个mousemove。 - mplungjan
我已经成功地将你的代码实现到我的网站中了。非常感谢你。如果有人在IE上遇到window.onblur的问题,这里有解决方案http://2aek.com/inventory/detectActiveWindow.html :) - zac1987
看起来不错。我发现这些代码大部分都来自于重复的问题。但我仍然想知道他们使用了什么奇怪的IE hack。 - mplungjan

5
一个简单的解决方案是在页面中检测鼠标移动。

我认为这也是 Gmail 如何在您长时间未使用 Gmail 标签时将您的聊天状态从离开切换到在线/忙碌的方式。 - TweeZz
谢谢。说真的,我讨厌 Facebook 的方式。当我试图指向某个要点击的东西时,它会移开,非常烦人。我不想使用鼠标检测的方式。我打算使用 window.onblur 的方式。请问为什么 Facebook 不使用 window.onblur 呢?这应该比鼠标检测更好... :) - zac1987
@zac1987 可以理解...我个人认为这是一个很棒的效果。如果我没记错的话,当用户保持页面处于焦点但空闲状态时,window.onblur事件不会发生。但我不能确定。 - user686605
我明白了。哇,我从没想过那个。FB真聪明 :) - zac1987
如果我只是在选项卡之间切换,而不把鼠标移到页面上会怎样?这不是正确的答案。在移动设备上也会出现问题。 - DragonKnight

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