0

我正在使用 PHP 和 jQuery/JavaScript 编写 PHP 购物车计时器脚本。

我每秒钟迭代一次 set-interval 函数以获取 PHP 的当前时间戳。

当第一个产品被添加到购物车时,计时器在计时器停止之前开始计时,它会提示用户,用户是要继续还是取消。

我的代码如下

$(document).ready(function(){
    var orderedtime = "echo $_SESSION['ordertime'];";
    if (orderedtime === null || orderedtime == ''){
       console.log("orderedtime is not set");
    }
    else{
       init();
   }
});
var currenttime;
var alerttime;
var extratime;
function cd(){
    alerttime = "<?php echo date('h:i:s', (strtotime($_SESSION['ordertime']) + (1 * 60)));  ?>"
    extratime = "<?php echo date('h:i:s', (strtotime($_SESSION['ordertime']) + (2 * 60)));  ?>";
    redo();
}
function redo(){
    currenttime = "<?php echo date('h:i:s', time()); ?>";
    if(alerttime == currenttime) {
        //doing something   
    }
    else if(currenttime == extratime){
        //doing something
    }
    else{
        cd = setTimeout("redo()",1000);
    }
}
function init(){
    cd();
}

仅存储第一次迭代值的 currenttime 变量没有得到更新。

如何解决这个问题?

请帮我解决它。

提前致谢。

4

2 回答 2

2

您实际上并没有在 setTimeout 循环中从服务器请求时间。

这条线

currenttime = "<?php echo date('h:i:s', time()); ?>";

在第一次生成页面并且不再更改时设置。如果您想更新时间,您需要向服务器发送请求。不过,这可能不是最好的方法。

于 2013-06-15T05:33:30.473 回答
0

除了 MikeW 的出色但不完整的答案之外,您需要一种方法从服务器请求时间并将其接收回 DOM。

只有一种方法可以做到这一点:AJAX。

正如 Mike 指出的,您在上面键入的 PHP 代码只运行一次:第一次生成页面时。在页面生成并且文档“准备好”之后,您必须使用 AJAX。

下面是一个完整的、可复制/可粘贴的示例,用于演示一种可行的方式。

请注意,我必须覆盖该orderedtime变量,因为我不知道您如何/何时设置它。

HTML/javascript 端:index.php

<html>
    <head>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
        <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js"></script>
        <link rel="stylesheet" href="http://code.jquery.com/ui/1.9.1/themes/base/jquery-ui.css" />

        <style>
            #timeDiv{width:40%;height:200px;background:wheat;padding:10px;}
        </style>

        <script type="text/javascript">
            $(document).ready(function() {
                //var orderedtime = "<?php echo $_SESSION['ordertime']; ?>";
                var orderedtime = '';
                if (orderedtime === null || orderedtime == ''){
                   console.log("orderedtime is not set");
                }else{
                    doAjax();
                }

                window.setInterval(function(){
                    doAjax();
                },2000);

            }); //END document.ready

            function doAjax() {
                $.ajax({
                    type: "POST",
                    url: "get_the_time.php",
                    data: "ordertime=" + orderedtime,
                    success: function(myData) {
                        $('#thetime').html(myData);
                    }
                });
            }

        </script>
    </head>

<body>

    <div id="timeDiv">
        The time is: <span id="thetime"></span>
    </div>

</body>

</html>

PHP端:get_the_time.php

<?php

if (isset($_POST['ordertime']) != true) {

    $d = date("h:i:s");

}else{

    $ot = $_POST['ordertime'];
    $d = date('h:i:s', (strtotime($ot) + (1 * 60)));

}

echo $d;

重要的提示:

使用 AJAX 时,从服务器发送的响应在success:函数内部接收,而在其他地方没有。

如果您稍后希望使用该数据,则将其分配给成功函数内的变量将不起作用。我发现最好的方法是将接收到的数据粘贴到某种元素中(隐藏的输入字段对此非常有用),然后在需要时从那里检索它。

例如:

<input type="hidden" id="myHiddenField" />

$.ajax({
    type: "POST",
    url: "get_the_time.php",
    data: "ordertime=" + orderedtime,
    success: function(myData) {
        $('#thetime').html(myData);
        $('#myHiddenField').val(myData);
    }
});

然后,在其他一些 javascript 函数中,您可以获取该数据并将其分配给某个变量,因此:

var someVar = $('#myHiddenField').val();

希望这会有所帮助,因为它已经很晚了。


This stackoverflow post有关于 AJAX 的更多信息/解释。查看底部的简化 AJAX 示例。

于 2013-09-12T21:16:48.243 回答