这是我的“需要” - 我有一个用户打开一个显示文档的窗口,我需要记录用户将该窗口“聚焦”或“打开”的时间量...如果用户查看另一个窗口,我想停止记录时间 - 如果他们重新关注该页面,则继续记录...基本上我想“知道”用户阅读页面需要多长时间。
这是一种审核类型方案,其中用户是需要记录时间的“可信”成员...我想保留“运行总计”仅供参考 - 所以如果用户说花了10分钟,在页面上,但我的日志显示窗口只打开了2分钟,我知道我遇到了问题......无论是我的代码还是我的人......;)
我的想法是当页面处于焦点时停止js计数器,暂停模糊或关闭,并将数据Ajax返回到我的数据库......如果用户返回,则将任何后续时间添加到该记录。 ..
onUnload似乎不起作用,至少在我尝试的时候 - 加上它没有关闭浏览器...所以我想我可以在文档窗口关闭时启动一个新窗口(不是令人讨厌 - 但是要对服务器进行日志记录调用,然后关闭它自己)。
有人有解决方案吗?我知道这一切都是“糟糕”的设计,但如果某人有'正确'的方式来处理这种情况 - 请告诉我。 (BTW-IE是一项要求 - 它是基于内联网的IE7要求。) THX
========下面的示例代码 - 这是'不'正在工作......有点============ 当我说它不工作时,这就是我的意思......“XMLHttpRequest”正在制作中,我假设因为响应是我期望的消息 - 但是日志不是变化(我知道你会说它是php页面,但如果我直接调用url - 它工作正常......所以它不是日志页面,另外60秒setInterval()似乎随机触发,因为我的响应警报刚刚弹出,有时10 in in没有时间的一排,肯定不是在'常规'60秒间隔...那么?
<script type="text/javascript">
var closeMe = 0;
var logMe = 0;
//the window doesn't have focus, do nothing or something that let's them know we're not logging at the moment
function onBlur() {
//after 2 min of non focus, close it.
closeMe = setInterval('window.close()',120000); //after 2 min of non focus, close it.
};
//the window has focus... keep logging.
function onFocus(){
//stop the close counter - in the event to 'blurred' sometime
clearInterval ( closeMe );
//run the AJAX on a schedule - we're doing it every minute - bu tyou can do it as often as you like
logMe = setInterval('logTime()',60000);
};
//call a script that logs another minute...
function logTime() {
var xhReq = new XMLHttpRequest();
xhReq.open("GET", "ajax-on-time-interval.php", false);
xhReq.send(null);
var serverResponse = xhReq.responseText;
alert(serverResponse);
}
// check for Internet Explorer... IE uses 'onfocusin/out" - everything else uses "onfocus/blur"
if (/*@cc_on!@*/false) {
document.onfocusin = onFocus;
document.onfocusout = onBlur;
} else {
window.onfocus = onFocus;
window.onblur = onBlur;
}
</script>
答案 0 :(得分:3)
我一直认为基于Ajax的常规“心跳”会每隔n秒更新一次底层数据库数据(取决于您需要的粒度,我认为每分钟都足够了)将是一个整洁的解决方案而不是弹出窗口,也避免了并非所有浏览器都优雅地处理onunload等事实。
那就是说,我假设这些机器上会启用JavaScript。 (根据你的问题看似公平。)
答案 1 :(得分:1)
if (/*@cc_on!@*/false) { // check for Internet Explorer
document.onfocusin = onFocus;
document.onfocusout = onBlur;
} else {
window.onfocus = onFocus;
window.onblur = onBlur;
}
我没试过。我刚才在这里读到它。 http://www.thefutureoftheweb.com/blog/detect-browser-window-focus
答案 2 :(得分:0)
部分解决浏览器关闭/崩溃问题的一个有点草率的解决方案是使用ajax函数在文档处于焦点时以设定的间隔对服务器DB进行ping操作。这样,如果客户端崩溃,您将在30秒内准确了解文档的打开时间。