我制作了一个照片库并且是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;
答案 0 :(得分:2)
当您重新加载页面时,旧的JavaScript代码(针对上一个请求)将停止运行并执行新的代码。
问题是您先拨打clearTimeout(setss)
然后定义setss
到底是什么。
一些提示:
如果您需要引号内的引号,只需使用不同的引号这样的事实:
var setss = window.setTimeout("delayer('"+src+'","'+dir+'","'+title+'","'+width+'","'+height+'","'+img+'")',5000);
...在编写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已经从使用字符串(完全凌乱)变为使用匿名函数。仔细研究一下。
有帮助吗?
答案 1 :(得分:1)
我很难理解你的问题,但我希望这会有所帮助。
重新加载页面时,页面的上一个实例以及与之关联的任何状态都不再存在。结果,超时已停止。从本质上讲,如果全局setSS
不存在,那么它引用的超时也不会超时,也不能负责启动幻灯片。
当从像PHP这样的东西提供活动页面时,服务器的工作(WRT创建页面的任何内容)就完成了。随后不能再将任何内容写入页面。您的clearTimeout基本上没用,因为它只能清除在加载页面期间设置的超时。它不会在现有页面中写入新的脚本元素。
变量不是跨页面共享的,因此如果您在一个页面中设置超时,并在另一个页面中清除它,那将无效。
因此,为了清除超时,您需要在clearTimeout
的同一页面(和该页面的实例)中调用setTimeout
,并且必须在{{setTimeout
之后执行该调用。 1}}。
如果上述情况均不适用于您的情况,那么$_POST['startss']
和$_POST['stopss']
是否可能在同一请求中设置?如果是这样,新页面将在尝试清除它后创建一个新的超时,因此将显示幻灯片。
(另外,使用闭包来创建传递给setTimeout的函数比编译调用函数的字符串更具可读性。)