Ошибка слайд-шоу Javascript (на основе сценариев) - PullRequest
0 голосов
/ 30 января 2010

В приведенном ниже коде слайд-шоу есть функция для нажатия ссылок «предыдущая» и «следующая». «Следующий» работает нормально, и если вы продолжаете нажимать на него, он циклически перебирает все слайды.

По какой-то причине «предыдущий» немного запутался - он вернется к слайду или двум, но потом просто исчезнет!

Не могли бы вы помочь? Спасибо!

<script type="text/javascript">
    start_slideshow(1, 3, 3000);

    var currentSlide = 1;

    function start_slideshow(start_frame, end_frame, delay) {
        id = setTimeout(switch_slides(start_frame,start_frame,end_frame, delay), delay);
    }

    function switch_slides(frame, start_frame, end_frame, delay) {

        return (function() {

            Effect.Fade('slide' + frame, { duration: 1.0 });

            if (frame == end_frame) {
                frame = start_frame; 
                currentSlide = frame;
            } else {
                frame = frame + 1; 
                currentSlide = frame;
            }

            Effect.Appear('slide' + frame, { duration: 1.0 });

            if (delay == 1000) {
                delay = 3000; 
            }

            id = setTimeout(switch_slides(frame, start_frame, end_frame, delay), delay);
        })
    }

    function stop_slideshow() {
        clearTimeout(id);
    }

    function next_slide() {

        clearTimeout(id);

        Effect.Fade('slide' + currentSlide, { duration: 1.0 });

        if (currentSlide == 4) {
            currentSlide = 0;
        }

        currentSlide = currentSlide + 1;
        Effect.Appear('slide' + currentSlide, { duration: 1.0 });
        id = setTimeout(switch_slides(currentSlide, currentSlide, currentSlide, delay), delay);
    }

    function previous_slide() {

        clearTimeout(id);

        if (currentSlide == 0) {
            currentSlide = 1;
        } else {
          Effect.Fade('slide' + currentSlide, { duration: 1.0 });

          currentSlide = currentSlide - 1;
          Effect.Appear('slide' + currentSlide, { duration: 1.0 });
          id = setTimeout(switch_slides(currentSlide, currentSlide, currentSlide, delay), delay);
        }
    }

</script>

1 Ответ

0 голосов
/ 27 июля 2010

Я столкнулся с такой проблемой или похожей на эту. Я предполагаю, что вы «быстро» нажимаете предыдущую или следующую кнопку до того, как эффект, который в настоящий момент находится в очереди, закончен. Это приведет к ошибке с эффектами, в результате чего к данному элементу будет применено более одного эффекта одновременно.

Чтобы исправить это, scriptaculous дает нам возможность ставить эффекты в очередь по порядку. Ссылка на документы здесь: http://wiki.github.com/madrobby/scriptaculous/effect-queues

По сути, вам нужно добавить область для ваших эффектов. Поэтому после добавления продолжительности вам необходимо добавить область действия очереди.

Пример:

Effect.Fade('slide' + currentSlide, { duration: 1.0, queue: { scope: 'slide_show' } });

Это позволяет нам отменить что-либо в очереди при нажатии кнопки.

var queue = Effect.Queues.get( 'slide_show' );
queue.each( function( effect ) { effect.cancel(); } );

Это, возможно, исправит ваш пробел ... но, возможно, нет. Независимо от того, эти методы должны использоваться в вашем слайд-шоу;)

Сообщите, если это не исправит, и я сделаю еще несколько неисправностей.

...