Javascript слайдер скользит как сумасшедший через некоторое время - PullRequest
4 голосов
/ 29 декабря 2011

Если я на некоторое время оставлю этот слайдер на сайте, он начнет скользить как сумасшедший.Как проверить эту ошибку?Откройте bellated.com/vyrai (тестовая страница).Вы можете увидеть большие фотографии изменения.Оставьте это на минуту.или два и просмотрите другие вкладки браузера, и когда вы вернетесь на этот сайт, вы увидите ошибку с ползунком.какие-либо идеи, как это исправить?

Я использую этот сценарий:

        <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 Ответ

2 голосов
/ 29 декабря 2011

Эта проблема имеет несколько причин, все они работают вместе в идеальном шторме:

  • Вы ставите в очередь новые слайды, основываясь исключительно на таймере, когда вместо этого вы должны ставить их в очередь в обратном вызове предыдущего слайдаanimation,
  • Вы используете браузер, который поддерживает 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...