我制作了一个照相馆,并由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>
    <?
    }

延迟器功能为新的模态框窗口(新的AJAX请求)传递参数。 我看到的问题。 当用户单击“幻灯片”按钮时,超时开始。 即使他们按下了“停止幻灯片”按钮(这会重新加载AJAX页面),计时器仍在运行(在后台),并且在clearTimeout(setss)中,设置不再可用(由于新的AJAX页面请求),因此clearTimeout无法清除。

有什么办法可以消除在后台运行的超时? 即使关闭了modalbox窗口,它也会在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;

===============>>#1 票数:2

问题

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

问题是您首先调用clearTimeout(setss) ,然后定义什么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); 

代码的最终版本

您的代码应如下所示:

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已从使用字符串(完全混乱)更改为使用匿名函数。 仔细研究一下。

有帮助吗?

===============>>#2 票数:1 已采纳

我在理解您的问题时遇到了一些困难,但希望能有所帮助。

  1. 重新加载页面时,该页面的先前实例以及与之关联的任何状态都将不复存在。 结果,超时已停止。 本质上,如果全局setSS不存在,则它所引用的超时也不会,因此,该超时不能负责开始幻灯片放映。

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

  3. 变量不会在页面之间共享,因此,如果要在一个页面中设置超时,而在另一页面中将其清除,则将不起作用。

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

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

(顺便说一句,使用闭包创建传递给setTimeout的函数比编译调用函数的字符串更具可读性)。

  ask by Loren Wolsiffer translate from so

未解决问题?本站智能推荐: