一段时间之后,Javascript滑块就像疯了似的

时间:2011-12-29 08:25:25

标签: javascript slider

如果我在网站上离开此滑块已有一段时间它会像疯了一样开始滑动。如何测试这个bug?打开bellated.com/vyrai(测试页面)。你可以看到大的changin照片。保持一分钟。或者两个并浏览其他浏览选项卡,当您回到此站点时,您将看到滑块的错误。任何想法如何解决这个问题?

我正在使用这个脚本:

        <script type="text/javascript">
          $(document).ready(function() {

        var currentPosition = 0;
        var slideWidth = 673;
        var slides = $('.slide');
        var numberOfSlides = slides.length;
        var slideShowInterval;
        var speed = 6000;

        //Assign a timer, so it will run periodically
        slideShowInterval = setInterval(changePosition, speed);

        slides.wrapAll('<div id="slidesHolder"></div>')

        slides.css({ 'float' : 'left' });

        //set #slidesHolder width equal to the total width of all the slides
        $('#slidesHolder').css('width', slideWidth * numberOfSlides);


        manageNav(currentPosition);

        //tell the buttons what to do when clicked
        $('.nav').bind('click', function() {

            //determine new position
            currentPosition = ($(this).attr('id')=='rightNav')
            ? currentPosition+1 : currentPosition-1;

            //hide/show controls
            manageNav(currentPosition);
            clearInterval(slideShowInterval);
            slideShowInterval = setInterval(changePosition, speed);
            moveSlide();
        });

        function manageNav(position) {
            //hide left arrow if position is first slide
            if(position==0){ $('#leftNav').hide() }
            else { $('#leftNav').show() }
            //hide right arrow is slide position is last slide
            if(position==numberOfSlides-1){ $('#rightNav').hide() }
            else { $('#rightNav').show() }
        }


        //changePosition: this is called when the slide is moved by the timer and NOT when the next or previous buttons are clicked
        function changePosition() {
            if(currentPosition == numberOfSlides - 1) {
                currentPosition = 0;
                manageNav(currentPosition);
            } else {
                currentPosition++;
                manageNav(currentPosition);
            }
            moveSlide();
        }


        //moveSlide: this function moves the slide 
        function moveSlide() {
                $('#slidesHolder').animate({'marginLeft' : slideWidth*(-currentPosition)});
        }

    });
</script>

html实现示例:

<div id="slideshow"> <div id="slideshowWindow"> 
    <div class="slide"><div class="slideText"> <h2 class="slideTitle">Pas mus kainos visada lanks&#269;ios!</h2> <p class="slideDes">"Tik pas mus &#303;sigykite savo nauj&#261;j&#261; vandens filtravimo sistem&#261; palankiausiomis kainomis".</p> <p class="slideLink"><a href="http://jayreillyportraits.com"></a></p> </div><!--/slideText--> </div><!--/slide--> 
    <div class="slide"><div class="slideText"> <h2 class="slideTitle">Naujas prekybos salonas</h2> <p class="slideDes">"Aplankykite mus naujai atsidariusiame prekybos salone &#352;ilal&#279;je S. Dariaus ir S. Gir&#279;no g. 24".</p> <p class="slideLink"><a href="http://jayreillyportraits.com"></a></p> </div><!--/slideText--> </div><!--/slide--> 
    <div class="slide"><div class="slideText"> <h2 class="slideTitle">Ie&#353;kote galimybi&#371; partneriaujant?</h2> <p class="slideDes">"Susisiekite su mumis ir mes aptarsime abiem pus&#279;ms palankias s&#261;lygas!".</p> <p class="slideLink"><a href="http://jayreillyportraits.com"></a></p> </div><!--/slideText--> </div><!--/slide--> 
    <div class="slide"><div class="slideText"> <h2 class="slideTitle">Turite klausim&#371;?</h2> <p class="slideDes">"Susisiekite su mumis ir m&#363;s&#371; specialistai pasistengs atsakyti  &#303; kiekvien&#261; j&#363;s&#371; u&#382;klaus&#261;.".</p> <p class="slideLink"><a href="http://jayreillyportraits.com"></a></p> </div><!--/slideText--> </div><!--/slide--> 
    </div></div> 

1 个答案:

答案 0 :(得分:2)

这个问题有多种原因可以在一场完美的风暴中共同发挥作用:

  • 您只是根据计时器排队新幻灯片,而您应该在上一张幻灯片动画的回调中将它们排队,
  • 您使用的浏览器支持requestAnimationFrame和
  • 您使用的是jQuery 1.6.2,其中包含对requestAnimationFrame的支持。

当您离开滑块运行的选项卡时,支持requestAnimationFrame的浏览器将停止在该选项卡中运行的所有动画。但是,计时器将继续运行!当您返回页面时,所有排队的动画会立即触发,这会给您带来这种失控效果。

要解决这个问题,最简单的解决方案是升级到jQuery 1.7.1,因为它们支持requestAnimationFrame(),因为浏览器支持不一致。但是,他们最终会把它带回来,所以你应该真正修复你的代码。

要修复代码,您应该只在上一张幻灯片.animate()回调中排队新的幻灯片动画。这将确保即使动画未运行也不会盲目排队。

如果您需要更多说明,请与我们联系。 tl; dr:改变这个:

 <script src="js/jquery-1.6.1.min.js" type="text/javascript"></script>

 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js" type="text/javascript"></script>

对此:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>

该问题的jQuery错误有更多信息:http://bugs.jquery.com/ticket/9381