可能重复:
有没有办法检测浏览器窗口当前是否处于活动状态?
我有一个每秒调用的函数,如果当前页面在前台,我只想运行,即用户没有最小化浏览器或切换到另一个选项卡.如果用户没有看到它并且可能是CPU密集型的话,它没有用处,所以我不想在后台浪费周期.
有谁知道如何在JavaScript中讲述这个?
注意:我使用jQuery,所以如果你的答案使用它,那很好:).
背景:我正在做一些需要检测人们是否注意的用户界面测试.但是,这个问题是不是有关的页面知名度API.
具体来说,我想知道如果在不同的浏览器中当前选项卡未激活或浏览器窗口未激活,我的Javascript代码将如何受到影响.到目前为止,我已经挖出了以下内容:
setInterval而setTimeout当标签不主动延迟降低 -看起来这只是最近开始出现,并可以搞砸茉莉花单元测试,周围的其他事物.requestAnimationFrame 选项卡未激活时速度变慢(合理,无法想到为什么这会对任何人造成太大影响)我有以下问题:
setInterval重复?它只是减少到一个限度或一个百分比?例如,如果我有一个10ms重复而不是5000ms重复,那么每个都会受到怎样的影响?是否有可靠的跨浏览器方式来检测选项卡是否具有焦点.
场景是我们有一个应用程序定期轮询股票价格,如果页面没有焦点我们可以停止轮询并节省每个人的交通噪音,特别是当人们是打开不同组合的几个选项卡的粉丝.
是window.onblur和window.onfocus这个选项?
我需要知道用户当前是否正在Google Chrome中查看标签.我试图将事件模糊和焦点绑定到窗口,但只有模糊似乎正常工作.
window.addEventListener('focus', function() {
document.title = 'focused';
});
window.addEventListener('blur', function() {
document.title = 'not focused';
});
Run Code Online (Sandbox Code Playgroud)
焦点事件很奇怪,只是有时候.如果我切换到另一个选项卡并返回,焦点事件将不会激活.但是,如果我点击地址栏然后返回页面,它就会.或者,如果我切换到另一个程序然后返回到Chrome,则会激活该选项卡当前是否已关注.
我需要在当前页面上检测用户何时处于非活动状态(不是单击或键入)超过30分钟.
我认为最好使用贴在身体标签上的事件blubbling,然后继续重置计时器30分钟,但我不确定如何创建它.
我有jQuery可用,虽然我不确定这有多少实际上会使用jQuery.
编辑:我更需要知道他们是否正在积极使用该网站,因此点击(更改字段或字段中的位置或选择复选框/无线电)或键入(在输入,textarea等).如果他们在另一个选项卡中或使用其他程序,那么我的假设是他们没有使用该网站,因此应该注销(出于安全原因).
编辑#2:所以每个人都清楚,这根本不是用于确定用户是否已登录,经过身份验证或其他任何内容.现在,如果用户在30分钟内没有发出页面请求,服务器会将用户注销.此功能可防止有人花费> 30分钟填写表单然后提交表单以发现他们尚未注销的时间.因此,这将与服务器站点结合使用,以确定用户是否处于非活动状态(不是单击或键入).基本上,交易是在闲置25分钟后,他们将看到一个对话框输入他们的密码.如果他们不在5分钟内,系统会自动将其注销,并且服务器的会话将被注销(下次访问页面时,与大多数站点一样).
Javascript仅用作对用户的警告.如果JavaScript被禁用,那么他们将不会收到警告(并且大部分网站都不工作),他们将在下次请求新页面时注销.
基本上,问题在于事件"visibilitychange"的行为.
它被触发: - 当我切换到浏览器窗口内的不同选项卡时.
(还行吧)
它没有被触发: - 当我使用ALT + TAB切换到不同的窗口/程序时.
(这应该触发,因为,就像最小化时一样,窗口的可见性可能会改变)
W3页面可见性API文档:http://www.w3.org/TR/page-visibility/
在规格表中没有关于ALT + TAB /程序切换的"页面可见性"的定义.我猜它在操作系统和浏览器之间有一些关系.
有解决方法来解决此问题吗?实现相当简单,我使用jQuery监听"visibilitychange"事件,然后在其回调中,我检查"document.visibilityState"的值,但问题是事件在预期时没有触发.
$(document).on('visibilitychange', function() {
if(document.visibilityState == 'hidden') {
// page is hidden
} else {
// page is visible
}
});
Run Code Online (Sandbox Code Playgroud)
这可以在没有jQuery的情况下完成,但ALT + TAB和任务栏开关隐藏/显示预期行为仍然缺失:
if(document.addEventListener){
document.addEventListener("visibilitychange", function() {
// check for page visibility
});
}
Run Code Online (Sandbox Code Playgroud)
我也尝试了ifvisible.js模块(https://github.com/serkanyersen/ifvisible.js),但行为是一样的.
ifvisible.on('blur', function() {
// page is hidden
});
ifvisible.on('focus', …Run Code Online (Sandbox Code Playgroud) 我需要检查用户是否有焦点窗口,我现在正在这样做:
var isonfocus=true;
window.onblur = function(){
isonfocus=false;
}
window.onfocus = function(){
isonfocus=true;
}
Run Code Online (Sandbox Code Playgroud)
每当我需要检查用户是否有焦点窗口我就是这么做的if(isonfocus==true).
问题:如果用户在页面加载之前失去焦点,即使我这样做
if(isonfocus==true)也会返回true,即使窗口不在焦点上,并且将var定义为false var isonfocus=false;也会反过来.
有人能帮我吗?谢谢.
更新
想象一下PTC(付费点击)网站,当您点击要查看的广告时,大多数网站都会验证用户是否实际看到了广告客户网站(有焦点)还是没有(失去焦点).
这与我需要的类似,我需要一种方法来验证用户是否在焦点上有窗口(包含iframe).
要获得焦点,用户可以单击iframe,文档或选项卡.
请注意,这需要适用于所有主流浏览器.
我想捕捉实际浏览器窗口的模糊和焦点 - 这意味着将焦点更改为子帧不感兴趣.
目前我一直在使用
$(top).focus()
$(top).blur()
和
$(window).focus()
$(window).blur()
但是,当用户将焦点更改为嵌入式iframe时,这些会触发,这是我不想要的.
有谁知道捕获TRUE激活和停用窗口的方法?
[编辑]
当用户从网页移动到嵌入式iframe的网页时,模糊和聚焦事件将触发.这与"窗口激活"事件不同,"事件激活"事件仅在实际的BROWSER窗口(或选项卡)被带到前面或被发送(即,更改或最小化)时触发.
我对模糊不感兴趣,因为用户导航到嵌入式框架的事实对程序没有影响.但是,如果用户最小化窗口,更改选项卡或切换到另一个程序,我想知道它...
我试图找到浏览器最小化和最大化状态,因为我想相应的浏览器状态点击AJAX请求.
有谁知道如何使用JavaScript检测浏览器状态.
关于iPad事件,如何确定iPad是否/何时从唤醒状态变为待机状态?
我想做的是,当iPad变为非活动/待机状态时,将我的Mobile-Safari网络应用程序置于锁定状态,并在再次唤醒时请求PIN.
javascript ×10
jquery ×4
browser ×1
events ×1
focus ×1
html5 ×1
ipad ×1
optimization ×1
polling ×1
state ×1