Использование модуля JavaScript для перебора текстового слайдера с циклом for - PullRequest
1 голос
/ 08 октября 2010

Я новичок в jQuery и переполнение стека, поэтому постараюсь быть конкретным, но, пожалуйста, потерпите меня. Я пытаюсь создать текстовый слайдер со связанными ссылками с нуля, используя модуль для перебора списка и повторения.

Вот код, с которым я работаю:

ul#text { position: relative; margin-bottom: 40px; height: 40px; }
ul#text li { position: absolute; display: none; }
.active { font-weight: bold; }
<ul id="text">
<li id="textBody">Suffering is not a result of physical pain alone. It can be compounded by changes in one's life, and changes in the self. <em>We understand, and we can help.</em></li>
<li id="textFamily">Aggressive assessment of physical symptoms &amp; pain in the body are key to support <em>the best possible quality of life</em>.</li>
<li id="textFunction">Chronic pain &amp; illness may affect your role in your family. We work with you and your family as you confront those changes.</li>
<li id="textPsyche">Chronic pain and illness make even everyday activities challenging. We will help you maintain independence and physical function.</li>
<li id="textSuffering">Changes in the physical body mean changes in the self. We will provide support as you navigate those changes in the psyche.</li>
</ul>
<ul id="vivid_buttons">
<li><a href="#" id="buttonBody">BODY</a></li>
<li><a href="#" id="buttonFamily" class="active">FAMILY</a></li>
<li><a href="#" id="buttonFunction">FUNCTION</a></li>
<li><a href="#" id="buttonPsyche">PSYCHE</a></li>
<li><a href="#" id="buttonSuffering">SUFFERING</a></li>
</ul>
$(document).ready(function () {

    function fadeAndMove() {
        var nextLi = $("#text > li:nth-child(" + i % 5 + ")");
        var nextA = $("#vivid_buttons > li:nth-child(" + i % 5 + ") > a");
        nextLi.fadeIn(1000, function () {
            $("#vivid_buttons > li > a").removeClass("active");
            nextA.addClass("active");
            setTimeout(function () {
                nextLi.fadeOut(1000);
            }, 4000);
        });
    }

    for (i = 1; i < 7; i++) {
        fadeAndMove($("#text"));
    }
});

На простом языке я хочу добавить предложение из первого списка и выделить соответствующую ссылку в нижнем списке. Затем я хочу, чтобы он исчез и перешел к следующему элементу.

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

Я знаю, что это сбивает с толку, но я был бы признателен за любую помощь, которую я мог бы получить.

Ответы [ 3 ]

3 голосов
/ 09 октября 2010

Избавьтесь от цикла for и просто заставьте setTimeout вызвать функцию fadeAndMove(), передав текущий индекс.

Пример: http://jsfiddle.net/drWhE/

$(document).ready(function () {

       // cache the LI elements
    var $lis = $("#text > li");
    var $aLis = $("#vivid_buttons > li");

    function fadeAndMove( currentIndex ) {
        var nextIndex = (currentIndex + 1) % 5;
        var nextLi = $lis.eq( nextIndex );
        nextLi.fadeIn(1000, function () {
            $aLis.eq( currentIndex ).children('a').removeClass("active");
            $aLis.eq( nextIndex ).children('a').addClass("active");
            setTimeout(function () {
                nextLi.fadeOut(1000, function() {
                      // Call fadeAndMove() passing nextIndex as the new currentIndex
                    fadeAndMove( nextIndex );
                });
            }, 4000);
        });
    }
       // Get it started on index 0
    fadeAndMove( 0 );
});
0 голосов
/ 09 октября 2010

Вот один из способов получить то, что вы ищете:

var $sentence_set = $('ul#text > li');
var $link_set = $('ul#vivid_buttons > li');

var highlight = function(which) {
  var el = $sentence_set.eq(which - 1);
  var position = el.prevAll('li').length;
  $link_set.removeClass('active').eq(position).addClass('active');
  $sentence_set.eq(position).siblings().fadeOut().end().fadeIn();
}

var loopcount = 0;
var repeater = setInterval(function() {
  var theList = $('#text > li');
  highlight(++loopcount % $sentence_set.length);
}, 4000);​

Вот скрипка .

И ... оранжевая полоска говорит мне, что Патрик Д.В. избил меня чем-то похожим. Ну, вот и все.

0 голосов
/ 09 октября 2010

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

Схематически это выглядит так (каждая строка представляет одну секунду):

li1.fadeIn
li2.fadeIn  |
li3.fadeIn  | |
li4.fadeIn  | | |      Timers
li5.fadeIn  V | | |    wait four
li1.fadeOut   V | | |  seconds
li2.fadeOut     V | |
li3.fadeOut       V |
li4.fadeOut         V
li5.fadeOut
li1.fadeIn
li2.fadeIn
.
.
.
etc, etc, ad nauseam.

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

nextLi.fadeIn(1000, function () {
    $("#vivid_buttons > li > a").removeClass("active");
    nextA.addClass("active");
    setTimeout(function () {
        nextLi.fadeOut(1000);
        fadeAndMove(i + 1);
    }, 4000);
});

(Поскольку это отложенный вызов, он не рекурсивный. Бесконечный цикл не разбьет стек.)

...