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

如果我在网站上留下这个滑块已经有一段时间它开始像疯了一样滑动.如何测试这个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> 

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

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

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

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

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

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

 <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

点赞