黑马程序员技术交流社区

标题: DOM中定时器走马灯切换时遇到问题 [打印本页]

作者: 高宜    时间: 2012-6-13 12:18
标题: DOM中定时器走马灯切换时遇到问题
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" >
  3. <head>
  4.      <title>123456789</title>
  5.    <!--   <script type="text/javascript">
  6.         function scroll(){
  7.           var title=document.title;
  8.           var firstCh=title.charAt(0);
  9.           var leftStr=title.substring(1,title.length);
  10.           document.title=leftStr+firstCh;
  11.         }
  12.         setInterval("scroll()",500)
  13.     </script>-->
  14.     <script type="text/javascript">
  15.     // 有问题 在运行时点击切换时出现问题!!!切换后依旧滚动但不是按预期的滚动
  16.         var m;
  17.         var n;
  18.         function left(){
  19.           var title=document.title;
  20.           var firstCh=title.charAt(0);
  21.           var leftStr=title.substring(1,title.length);
  22.           document.title=leftStr+firstCh;
  23.         }
  24.         function right(){
  25.             var title=document.title;
  26.             var rightCh=title.charAt(title.length-1);
  27.             var leftStr=title.substring(0,title.length-1);
  28.             document.title=rightCh+leftStr;
  29.         }
  30.         function leftScroll(){
  31.             clearInterval(n);
  32.             var m=setInterval("left()",500);
  33.         }
  34.         function rightScroll(){
  35.            clearInterval(m);
  36.           var n= setInterval("right()",500);
  37.         }
  38.         
  39.     </script>
  40. </head>
  41. <body>
  42. <input type="button" value="向左滚动" onclick="leftScroll()" />
  43. <input type="button" value="向右滚动" onclick="rightScroll()" />

  44. </body>
  45. </html>
复制代码

作者: 黑马-杨鹏立    时间: 2012-6-16 22:17
看了下,你想表达的咋切换的时候他会出的问题有几种。。。。
1,假如向右滚动,你切换到向左滚动效果是出不来的首先你得清除他向右滚动
2,滚动的时间会叠加,在同一个方向上连续点上去你看到的效果是越来越快。。。但是真正的不是时间叠加,而是每次的滚动都是独立的例如:用5秒做一周期吧  你上面500毫秒太快了。第一点击是5秒后 ,第二次点击不会在5/2而是移动后的一秒后点击,那出现的是两次移动出现的间隔是一秒。。。依次类推~~~~
3,你做定时器滚动时记得做清除。。。你没有做清除所以看不出效果
作者: 张恒维    时间: 2012-6-17 01:23
1,假如向右滚动,你切换到向左滚动效果是出不来的首先你得清除他向右滚动
2,滚动的时间会叠加,在同一个方向上连续点上去你看到的效果是越来越快。。。但是真正的不是时间叠加,而是每次的滚动都是独立的例如:用5秒做一周期吧  你上面500毫秒太快了。第一点击是5秒后 ,第二次点击不会在5/2而是移动后的一秒后点击,那出现的是两次移动出现的间隔是一秒。。。依次类推~~~~
3,你做定时器滚动时记得做清除。。。你没有做清除所以看不出效果


从代码上看,其实第一点已经做到了。在每次点击向一个方向滚动的时候都会清除另一个方向的滚动。只不过考虑的不周全,从而出现了问题。
其错误有两个地方:第一、非常明显的错误。就是在函数内重复申明了m和n两个变量。而在调用clearInterval()函数时传递的参数却是最上面申明的全局变量m和n,所以不可能清除得了。第二、也就是考虑不到位。我们知道每点击一次滚动的时候都会产生一个ID并赋给变量m或n,但是重复点击一个按钮时,那么当前产生的ID将会覆盖掉前一个ID而赋值给变量,这就造成了清除的只会是最后一次点击时产生的ID,而之前的却因为ID被覆盖而无法清除。因此,在清除另一方向滚动的同时应该还要清除一次己方的滚动。代码如下:
  1. function leftScroll(){
  2.             stopScroll();
  3.             m=setInterval("left()",500);
  4.            }

  5.         function rightScroll(){
  6.            stopScroll();
  7.            n= setInterval("right()",500);
  8.         }

  9.         function stopScroll(){
  10.            clearInterval(n);
  11.            clearInterval(m);
  12.         }
复制代码
这样即使多次重复的点击一个按钮也不会造成时间叠加的问题了。
作者: 高宜    时间: 2012-6-17 16:24
张恒维 发表于 2012-6-17 01:23
从代码上看,其实第一点已经做到了。在每次点击向一个方向滚动的时候都会清除另一个方向的滚动。只不过考 ...

讲解的透彻,十分感谢!,原来没有定义定时器之前清理定时器也不报错的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2