onbeforeunload并不总是有效

时间:2013-09-16 03:43:19

标签: javascript onbeforeunload

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

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

解决这个问题的正确理由是什么?

更新 我真的无法告诉你它的作用和不起作用的情况。我只在项目页面上使用此功能。有时,当我点击一个项目页面并离开去访问另一个项目时,它会工作其他时间它不是真的是零星的。我可以说的是,如果我将项目页面留在主页等非项目页面上,则不会记录任何记录。

3 个答案:

答案 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