在页面刷新/关闭之前设置cookie

时间:2013-03-26 18:04:20

标签: php javascript joomla

我再一次向SO社区寻求帮助。

我正在修改一个Joomla“测验”组件,使其按照我需要的方式运行。 我现在要做的是改变组件的“刷新”行为。基本上,每个测验都有一个超时,即用户不再可以访问测验的时间,因此当计时器变为0时,提交测验等等,但是这个组件的默认行为使得它在每次如果页面刷新,计时器将重置为初始设定时间(比方说,10分钟)

事情是,我希望能够让计时器从原来的位置继续进行刷新。

我从3年或4年前就没有使用PHP,所以我有点迷失。

为了能够达到预期的行为我正在设置一个cookie,它将存储(通过内爆)初始时间(当测验被打开时)和“现在”时间(在加载时它被设置为0但是在刷新我想“更新”cookie以存储重载时间。)

利用初始时间和现在的时间,我将能够计算已经过了多少时间并将计时器从中断的位置开始。

问题是,我正在尝试使用javascript'onbeforeunload'“更新”cookie,以便我可以设法将刷新时间放入cookie中。但出于某种原因,它根本没有做任何事情。当我去看cookie内容时,从设置cookie开始,一切都是一样的。

我知道为了更新cookie,我必须删除它然后重新设置它,但我没有成功。

下面是示例代码:

//This is responsible for setting the cookie (via PHP):
<?php
$name = "progress";
$now = 0;
$time_diff = 0;
$expire = time() + 3600;
$data = array(time(), $now, $time_diff, $this->quiz->time_limit);
//$var = implode(',', $data);

if(isset($_COOKIE[$name])) {
    /* If defined, update the timer */

} else {
    setcookie($name, implode(',',$data), $expire);
}
echo $_COOKIE[$name];
echo "<br />";
echo $this->quiz->time_limit;
?>

这是检测“刷新”事件(使用运行PHP的Javascript):

window.onbeforeunload = function() {
    <?php
        $name = "progress";
        $list = explode($_COOKIE[$name]);
        //delete cookie
        setcookie($name, "", time() - 3600);

        //Update the fields
        $list['1'] = time(); //now - refresh time
        $list['2'] = $list['1'] - $list['0']; //time_diff

        //Set the cookie again
        setcookie($name, implode(',', $list), time() + 3600);
    ?>
}

有人能指出这段代码有什么问题吗?

1 个答案:

答案 0 :(得分:2)

正如评论中所说,JavaScript无法像这样运行PHP代码......但是如果你使用AJAX那么你可以。现在使用您发布的代码供我们查看,如果您在浏览器中加载页面并查看代码,您的功能将如下所示:

window.onbeforeunload(){

}

因此,当您关闭浏览器时,您的cookie不会发生任何事情就不足为奇了。现在,在没有看到你的其他功能的情况下,很难准确地说出发生了什么,但你可以使用PHP和JavaScript交织在一起,但是以不同的方式。让我用一个例子解释一下。

window.onbeforeunload(){
  var name = <?php $name='Steve'; echo($name); ?>;
  console.log(name);
}

如果您有这个代码并在浏览器中加载页面,您将不再看到PHP代码,而是会看到:

window.onbeforeunload(){
  var name = 'Steve';
  console.log(name);
}

<小时/> 话虽如此,这里有一些你可能会发现有用的链接。