我正在制作一个简单的脚本,以便在用户访问页面和离开页面时保存一些数据,以及其他一些页面详细信息。该脚本“有效”,但它不能一直工作。它似乎偶尔起作用。我没有得到控制台错误。服务器端工作正常。
window.onload = function() {
var timeStarted, i, c, l, timeLeft, pageData;
timeStarted = new Date().getTime();
i = <?php echo $model->id; ?>;
c = <?php echo $model->cat; ?>;
l= <?php echo $model->loc; ?>;
window.onbeforeunload = function(){
timeLeft = new Date().getTime();
pageData = [{name: 'timeStarted', value: timeStarted},
{name: 'i', value: job},
{name: 'c', value: cat},
{name: 'l', value: loc},
{name: 'timeLeft', value: timeLeft}];
// Set url for JavaSCript
var url = '<?php echo Yii::app()->createUrl("item/viewedItemInformation"); ?>';
<?php echo CHtml::ajax(array(
'url'=>'js:url',
'data'=> "js: pageData",
'type'=>'post',
'dataType'=>'json',
)); ?>;
}
}
注意
我刚刚阅读了这篇文章window.onbeforeunload not working in chrome,我正在使用chrome。但是我似乎也在FF中得到了相同的结果。
解决这个问题的正确理由是什么?
更新 我真的无法告诉你它的作用和不起作用的情况。我只在项目页面上使用此功能。有时,当我点击一个项目页面并离开去访问另一个项目时,它会工作其他时间它不是真的是零星的。我可以说的是,如果我将项目页面留在主页等非项目页面上,则不会记录任何记录。
答案 0 :(得分:1)
您可以使用setTimeout
来延迟标签关闭以执行AJAX请求,但如果超过大约50毫秒,大多数人会注意到并且可能会避免访问您的网站。
我认为您遇到的问题是客户端的浏览器或操作系统停止响应/工作时。如果不是完全不可能的话,在任何情况下获得100%的数据将是非常困难的。
据说你没有澄清你的想法情况是onbeforeunload
事件不起作用的地方,所以你的问题对主观性太过开放了。如果您更新了您的问题并然后对我的回答发表评论,我将很乐意对其进行修改,以便更具体。
尝试测试的事情......
1。)点击本地链接(您网站上的链接指向您网站上的其他网页)。
2。)点击外部链接。
3.。)关闭标签。
4.。关闭窗口。
5.)通过任务管理器/等效文件终止浏览器进程。
6。)拔下计算机上的插头以模拟停电。
根据Mozilla Dev Network ...
Since 25 May 2011, the HTML5 specification states that calls to
window.showModalDialog(), window.alert(), window.confirm(), and window.prompt()
methods may be ignored during this event.
https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload
请注意,在支持onbeforeunload
时,某些浏览器可能不能。在这种情况下,您可以尝试使用AJAX请求ping服务器,只需查看Apache访问日志以获取请求,通常您可以将JavaScript对象/数据/文本/等作为HTTP查询发送,例如request.php?q=javascript-object
例如,您可以直观地确认浏览器是否正在执行您的想法/希望它执行的操作。
答案 1 :(得分:0)
到目前为止,这就是我如何去做的。也许它会对其他人有所帮助,如果没有,并且有问题,我将删除答案。
当我加载项目页面时,我使用标识符,类别,ID号,位置,使用NOW()开始的时间来更新我的数据库,并且还将剩余时间更新为NOW()。
然后在页面本身我运行这个javascript。
<script>
// Set url for JavaSCript
var url = '<?php echo Yii::app()->createUrl("item/viewedItemInformation"); ?>';
var item = '<?php echo $model->id; ?>';
var data = [{name: 'item', value: item},
{name: 'async', value: false}];
// call function to see if still on page
var onPage = setInterval(function() {
<?php echo CHtml::ajax(array(
'url'=>'js:url',
'data'=> "js: data",
'type'=>'post',
'dataType'=>'json',
));
?>
}, 5000);
因此脚本每5秒运行一次并调用另一个控制器函数,该函数在DB中搜索记录并使用NOW()
更新time_ended和调用控制器函数的时间。
希望这是有道理的,我只测试了一下,所以我需要做更多的事情。如果有人发现任何问题,请告诉我。
<强>更新强>
到目前为止,这个脚本似乎运行良好。我只在我的localhost上工作,我有LinkedIn插件,他们似乎停止脚本工作。我一直收到这个错误:我以前从未注意过它。我最近重新安装了我的XAMPP,所以可能没有意识到设置之间的任何其他差异。我也不确定为什么插件似乎会阻止我的JS脚本工作?
Origin http://localhost is not allowed by Access-Control-Allow-Origin.
Jonnny
答案 2 :(得分:0)
onbeforeunload
事件。如果页面上没有任何互动事件(例如,单击而不是悬停),则不会触发onbeforeunload
。