2

我正在制作一个简单的脚本来保存用户访问页面和离开页面时的一些数据,以及其他一些页面详细信息。该脚本“有效”,但并非一直有效。它似乎偶尔工作。我没有收到控制台错误。服务器端工作正常。

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 中也得到了相同的结果。

解决这个问题的正确方法是什么?

更新 我真的无法告诉你它在什么情况下起作用和不起作用。我只在项目页面上使用此功能。有时,当我单击一个项目页面并离开访问另一个项目时,它会在其他时候起作用,但它确实是零星的。我能说的是,如果我将项目页面留给像主页这样的非项目页面,则不会记录任何记录。

4

3 回答 3

3

onbeforeunload仅当用户与站点发生任何交互时才会触发事件。如果您的页面上没有任何交互事件(例如单击,而不是悬停),onbeforeunload则不会被触发。

于 2020-11-11T14:00:08.397 回答
1

您可以使用setTimeout延迟选项卡关闭来执行 AJAX 请求,但如果它超过大约 50 毫秒,大多数人会注意到并且可能会避免访问您的网站。

我认为您遇到的问题是客户端的浏览器或操作系统停止响应/工作。如果不是完全不可能的话,在任何情况下获取 100% 的数据都是极其困难的。

话虽如此,您还没有澄清您认为哪些情况是该onbeforeunload事件无法正常工作的,因此您的问题对主观性过于开放。如果您更新您的问题,然后评论我的回答,我将很乐意对其进行修改,以便更具体。


尝试测试的东西...

1.) 单击本地链接(您网站上的链接到您网站上的另一个页面)。

2.) 单击外部链接。

3.) 关闭选项卡。

4.) 关闭窗口。

5.)通过任务管理器/等效项终止浏览器进程。

6.) 拔下电脑上的插头以模拟断电。


根据 Mozilla 开发网络...

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,例如这样您就可以直观地看到确认浏览器是否正在执行您认为/希望它执行的操作。

于 2013-09-16T05:40:25.103 回答
0

到目前为止,这就是我的做法。也许它对其他人有帮助,如果没有并且有问题,我将删除答案。

当我加载项目页面时,我使用 NOW() 使用标识符、类别、ID 号、位置、开始时间更新我的数据库,并将剩余时间更新为 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 秒运行一次并调用另一个控制器函数,该函数在数据库中搜索记录并使用调用控制器函数的时间更新 time_ended NOW()

希望这是有道理的,我只测试了一点,所以我需要做更多的事情。如果有人发现它有任何问题,请告诉我。

更新

到目前为止,这个脚本似乎工作正常。我只在我的本地主机上工作,我有 LinkedIn 插件,它们似乎停止了脚本的工作。我不断收到此错误:我以前从未注意到它。我最近重新安装了我的 XAMPP,因此可能不知道设置之间的任何其他差异。我也不确定为什么插件似乎会阻止我的 JS 脚本工作?

Origin http://localhost is not allowed by Access-Control-Allow-Origin.

乔尼

于 2013-11-20T22:55:18.937 回答