Цикл Jquery - несколько вложенных слайд-шоу и завершение цикла - PullRequest
3 голосов
/ 09 апреля 2011

Я пытаюсь создать слайд-шоу с помощью плагина jQuery Cycle, который содержит еще один уровень вложенных слайд-шоу в некоторых слайдах верхнего уровня.

Основные слайды «контейнера» скользят горизонтально, а затем - для слайдов «контейнера», которые содержат более одного изображения с левой стороны - эти изображения скользят вверх вертикально.

Пример здесь, потому что я представляю, что это трудно визуализировать: http://dl.dropbox.com/u/2890872/js-test/index.html

Вы попадете на второй слайд верхнего уровня только до того, как он остановится, даже при том, что есть шесть слайдов верхнего уровня (это моя проблема - второй слайд содержит только одно левое внутреннее изображение, которое останавливает сценарий ), но вы можете увидеть, что это за переходы, и проверить весь код.

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

JS:

<script type="text/javascript">
$(function(){ 
    // init and stop the inner slideshows
    var inners = $('.slide-up').cycle().cycle('stop');

    var slideshow = $('#home-slides').cycle({
        fx: 'scrollHorz',
        speed: 300,
        timeout: 0,
        before: function() {
            // stop all inner slideshows
            inners.cycle('stop');

            // start the new slide's slideshow
            $(this).children().cycle({
                fx: 'scrollUp',
                timeout: 2000,
                autostop: true,
                end: function() {
                    // when inner slideshow ends, advance the outer slideshow
                    slideshow.cycle('next');
                }
            });
        } 
    });
});
</script>

Образец HTML:

<div id="home-slides">
    <div>
        <div class="slide-up">
            <img src="i/home/slideshow/1l-1.jpg" alt="" width="284" height="420" />
            <img src="i/home/slideshow/1l-2.jpg" alt="" width="284" height="420" />
            <img src="i/home/slideshow/1l-3.jpg" alt="" width="284" height="420" />
        </div>
        <img src="i/home/slideshow/1r.png" alt="" width="291" height="420" />
    </div>
    <div>
        <div>
            <img src="i/home/slideshow/2l-1.jpg" alt="" width="284" height="420" />
        </div>
        <img src="i/home/slideshow/2r.jpg" alt="" width="291" height="420" />
    </div>
    <div>
        <div class="slide-up">
            <img src="i/home/slideshow/3l-1.jpg" alt="" width="284" height="420" />
            <img src="i/home/slideshow/3l-2.jpg" alt="" width="284" height="420" />
        </div>
        <img src="i/home/slideshow/3r.png" alt="" width="291" height="420" />
    </div>
    <div>
         …additional slides…
    </div>
</div>

Слайд-шоу заканчивается на втором # home-slides> div, потому что есть только одно изображение. Я попытался удалить вложенность и класс «слайд-ап» из слайдов без внутреннего слайд-шоу, но это не помогает.

Опять же, полную рабочую версию со всем соответствующим кодом можно найти здесь: http://dl.dropbox.com/u/2890872/js-test/index.html

----------- ИЗД. 4/10 - Незначительные обновления и, возможно, лидерство ----------

Я отредактировал код здесь и в примере ссылки, чтобы добавить некоторые детали, которые устраняют первые мысли для устранения неполадок. Теперь только слайды со вторичными слайд-шоу используют класс «слайд-ап».
- Я попытался указать класс «.slide-up» в функции для обратного вызова «end» («$(this).children('.slide-up').cycle…»), что не позволяет завершить цикл для слишком небольшого количества слайдов, но это только приводит к его завершению для непревзойденные элементы!

Самое близкое, что я получил, это добавление условной проверки к функции в конце обратного вызова: (Я использую длину, чтобы проверить наличие скользящего элемента div. Если есть лучший способ, дайте мне знать)

before: function() {
 if ( $(this).children('.slide-up').length != 0 ) {
    // stop all inner slideshows
    inners.cycle('stop');

    // start the new slide's slideshow
    $(this).children('.slide-up').cycle({
        fx: 'scrollUp',
        timeout: 2000,
        autostop: true,
        end: function() {
            // when inner slideshow ends, advance the outer slideshow
            slideshow.cycle('next');
        }
    });
   } else alert('NO INNER SLIDESHOW!');

Это исключает все ошибки и завершения непосредственно из цикла jQuery, но основное слайд-шоу по-прежнему останавливается на слайде без дополнительного слайд-шоу. Я думаю, что нужно вставить что-то в выражение "else", относящееся к запуску "slideshow.cycle ('next');", но я не нашел правильный синтаксис, чтобы заставить это работать.

----------- РЕДАКТИРОВАТЬ # 2 4/10 - ----------

самый последний рабочий пример: http://dl.dropbox.com/u/2890872/js-test/index2.html

Перемещение функции before в собственную именованную функцию для обеспечения большей чистоты.

function onBefore(currSlideElement, nextSlideElement, options, forwardFlag) {
     if ( $(this).children('.slide-up').length != 0 ) {
        // stop all inner slideshows
        //inners.cycle('stop');

        // start the new slide's slideshow
        $(this).children('.slide-up').cycle({
            fx: 'scrollUp',
            timeout: 2000,
            autostop: true,
            end: function() {
                // when inner slideshow ends, advance the outer slideshow
                slideshow.cycle('next');
            }
        });
       } 
      // else null;
      else $(this).parent().cycle({ 
        end: function() { slideshow.cycle('next'); }
       });
    } 

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

Я не понимаю: 1) Как сохранить настройки. (Я думал, именно поэтому вар "слайд-шоу" был создан в первую очередь)

2) Почему еще нужен оператор else - я не понимаю, почему внешние слайды вообще останавливаются, когда условный оператор «.slide-up» не выполняется - я думаю, что внешнее слайд-шоу просто продолжится как обычно.

Ответы [ 4 ]

2 голосов
/ 11 апреля 2011

Фейсбук друг решил это!Спасибо, фейсбук друг!

var slideshow = $('#home-slides').cycle({
    fx: 'scrollHorz',
    speed: 300,
    timeout: 0,
    before: function(curElement, nextElement, options, forwardFlag) {
        if($(nextElement).children('.slide-up').length != 0) {
            $(nextElement).children('.slide-up').cycle({
                fx: 'scrollUp',
                timeout: 2000,
                autostop: true,
                end: function() { slideshow.cycle('next'); }
            });
        }
        else {
            setTimeout(function(){ slideshow.cycle('next'); }, 2000);
        }
    }
});

Рабочий пример здесь: http://dl.dropbox.com/u/2890872/js-test/index3.html Мне нужно немного больше изучить Cycle и изменения, которые он сделал, чтобы полностью понять роль «следующего элемента» в этом кодено это, безусловно, работает!

1 голос
/ 10 апреля 2011

Проверьте, поможет ли вам этот подход: http://www.devcha.com/2010/05/fixed-cycle-terminating-too-few-slides.html

Вы проверяли этот вопрос ... выглядит похожая проблема, но другой подход: Вложенный цикл jQuery?

0 голосов
/ 16 января 2012

Я загрузил рабочий пример здесь http://ferienhaus -fischland-ahrenshoop.de / mini4 / После завершения этого проекта в ближайшем будущем вы найдете галерею в любом месте на этой странице http://ferienhaus -fischland-ahrenshoop.de , вероятно, на стартовой странице и другие.

0 голосов
/ 16 января 2012

После того, как я «наградил» плагин цикла как лучший и самый простой плагин для слайд-шоу, я немного больше на него посмотрел, провел несколько экспериментов и провел с ним несколько часов. Результаты: 1. цикл (). Цикл («остановка») так же, как и просто цикл («остановка»), никогда не работал должным образом, он останавливает внутренние слайд-шоу после каждого второго содержимого. Я изменил его в один цикл ({timeout: 0}) ..., который я не очень понимаю, но он работает абсолютно нормально, в том числе обзоры Firebug на JS активность. 2. Поскольку мне нужно, чтобы он работал не только с одним использованием на странице, а также с возможностью автоматического решения, нужны ли элементы управления или нет, поэтому я изменил пару вещей и поместил все js в документ $ ( ) .ready (function () {} в заголовке страницы. Первое .inner-slideshow получает добавленный class = "active" из серверного php-скрипта.

Код теперь выглядит так

//-----------------jquery cycle plugin modified by Michael Gerner, ddlab, 2012-01-15---------------
$('.slideshow').each(function(){

    var sl = $(this);
    var sl_index = sl.index('.slideshow');
    var allinner = sl.find('.inner-slideshow');
    var firstinner = sl.children('.inner-slideshow:eq(0)');

    //----settings outer slideshow
    var outerfx = 'scrollHorz';
    var outerspeed = 500;
    var outertimeout = 0;
    var outerprev = '#sl'+sl_index+'prev';
    var outernext = '#sl'+sl_index+'next';

    //----settings inner slideshow
    var innerfx = 'fade';
    var innerspeed = 2000;
    var innertimeout = 6000;

    if (allinner.size() > 1) { //---------more than one inner slideshow
        var setcontrols = '<div class="slideshow-controls"><a class="prev" id="sl'+sl_index+'prev" href="#"></a> <a class="next" id="sl'+sl_index+'next" href="#"></a></div>';
        sl.after(setcontrols);
        var controls_a = sl.find('.slideshow-controls a');

        controls_a.click(function(){
            var activeinners = sl.find('.active');
            activeinners.each(function(){
                $(this).removeClass('active').cycle({timeout:0});
            });
        });

        sl.cycle({
            fx:outerfx,
            speed:outerspeed,
            timeout:outertimeout,
            prev:outerprev,
            next:outernext,
            before:function(){
                var activeinners = sl.find('.active');
                activeinners.each(function(){
                    $(this).removeClass('active').cycle({timeout:0});
                });
            },
            after:function(){
                $(this).addClass('active').cycle({
                    fx:innerfx,
                    speed:innerspeed,
                    timeout:innertimeout,
                    autostop: true,
                    end: function() { sl.cycle('next'); }
                });
            }
        });
    }
    else { //------------just one inner slideshow
        firstinner.cycle({
            fx:innerfx,
            speed:innerspeed,
            timeout:innertimeout
        });
    }
});
//-----------------jquery cycle plugin modified by Michael Gerner, ddlab, 2012-01-15---------------

Теперь я доволен этим, особенно загруженность браузера на js очень мала, что я хочу отметить как важный для мобильных устройств, и, наконец, я добавил несколько инструментов редактирования внешнего интерфейса, таких как html5upload и jq-filemanager. , который используется владельцем сайта для управления контентом для галереи.

Спасибо за все предыдущие обзоры и рецензии, которые мне очень помогли получить этот трек :-) Вы можете найти легкий скриншот (26 КБ) здесь http://ddlab.de/screenshots/cycle_gallery.jpg

...