JavaScript setTimeout不会死。

时间:2011-12-11 21:43:21

标签: javascript settimeout

我制作了一个照片库并且是AJAX驱动的。以下是相关的代码片段。

    if (isset($_POST['stopss'])){
    echo'<script type="text/javascript">
    clearTimeout(setss);
    </script>';
    }

    if (isset($_POST['startss'])){
    ?>
    <script type="text/javascript">
    var setss = window.setTimeout('delayer(\''+src+'\',\''+dir+'\',\''+title+'\',\''+width+'\',\''+height+'\',\''+img+'\')',5000);
    </script>
    <?
    }

delayer函数传递params用于新的模态框窗口(新的AJAX请求)。 我看到的问题。当用户单击幻灯片按钮时,超时开始。 即使按下Stop Slideshow按钮(这会重新加载AJAX页面),计时器仍在运行(在后台),在clearTimeout(setss)中,setss不再可用(因为新的AJAX页面请求)所以clearTimeout无法清除。

有没有办法杀死在后台运行的超时?即使模态框窗口关闭,5秒钟后它也会打开并愉快地继续播放幻灯片。

顺便说一下,这是模态框调用。         Modalbox.show('../ b-gal-scripts / ajaxgal.php',{title:title,overlayOpacity:.1,width:width,height:height,method:'post',params:{src:next, dir:dir,img:img,ssimg:next}});返回false;

2 个答案:

答案 0 :(得分:2)

问题

当您重新加载页面时,旧的JavaScript代码(针对上一个请求)将停止运行并执行新的代码。

问题是您先拨打clearTimeout(setss)然后定义setss到底是什么。

还有一些其他问题

一些提示:

  1. 不要混合引用样式,这样就会造成混乱。
  2. 如果您需要引号内的引号,只需使用不同的引号这样的事实:

    var setss = window.setTimeout("delayer('"+src+'","'+dir+'","'+title+'","'+width+'","'+height+'","'+img+'")',5000);
    
  3. ...在编写JavaScript时,最好习惯基于事件的编程闭包,如下所示:

    var sets = window.setTimeout(function(){
        delayer(src, dir, title, width, height, img);
    }, 5000);
    
  4. 您的代码的最终版本

    您的代码应如下所示:

    if (isset($_POST['startss']) && !isset($_POST['stopss'])){
        ?>
        <script type="text/javascript">
            var setss = window.setTimeout(function(){
                delayer(src, dir, title, width, height, img);
            }, 5000);
        </script>
        <?
    }
    

    它利用了这样一个事实,即你不需要首先输出一个执行的脚本,只是在不需要时立即停止它。只需使用PHP条件来检查是否要执行它,输出它。

    其次,JS已经从使用字符串(完全凌乱)变为使用匿名函数。仔细研究一下。

    有帮助吗?

答案 1 :(得分:1)

我很难理解你的问题,但我希望这会有所帮助。

  1. 重新加载页面时,页面的上一个实例以及与之关联的任何状态都不再存在。结果,超时已停止。从本质上讲,如果全局setSS不存在,那么它引用的超时也不会超时,也不能负责启动幻灯片。

  2. 当从像PHP这样的东西提供活动页面时,服务器的工作(WRT创建页面的任何内容)就完成了。随后不能再将任何内容写入页面。您的clearTimeout基本上没用,因为它只能清除在加载页面期间设置的超时。它不会在现有页面中写入新的脚本元素。

  3. 变量不是跨页面共享的,因此如果您在一个页面中设置超时,并在另一个页面中清除它,那将无效。

  4. 因此,为了清除超时,您需要在clearTimeout的同一页面(和该页面的实例)中调用setTimeout,并且必须在{{setTimeout之后执行该调用。 1}}。

    如果上述情况均不适用于您的情况,那么$_POST['startss']$_POST['stopss']是否可能在同一请求中设置?如果是这样,新页面将在尝试清除它后创建一个新的超时,因此将显示幻灯片。

    (另外,使用闭包来创建传递给setTimeout的函数比编译调用函数的字符串更具可读性。)