Что не так с этой функциями рекурсии? (Выпуск мероприятия)

StackOverflow https://stackoverflow.com/questions/3969092

Вопрос

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

Мой подход состоит в том, чтобы создать клон UL, добавить его после текущего ул и запускайте его прокрутки, затем удалите оригинал UL после того, как он полностью скрыт.

Это работает почти идеально, за исключением одной вещи. Когда вы вызываете функцию, она генерирует время, необходимое для настроек. Этот Settimout используется для создания нового UL и установить его двигаться.

Это работает нормально для первой петли, но затем глюки.

Это немного сложно объяснить, но, похоже, во второй раз, когда нужно призвать тайм-аут, вместо того, чтобы ждать времени, он просто называет себя мгновенно. Пожалуйста, посмотри http://webspirited.com/marquee.html. Для примера

Для рабочего примера. Код JavaScript выглядит следующим образом:

var count = 0;
$('document').ready(function () {
    //generate some random rows
    for (var i = 0; i <= 20; i++)
    $('.ulscroll').append('<li>Content ' + i + '</li>');
    //add one row so we can see its the last
    $('.ulscroll').append('<li>Last Item</li>');

    //set the ul's width
    var width = 0;
    $('.ulscroll').children('li').each(function () {
        width += $(this).outerWidth();
    });
    log('ul width: ' + width);
    $('.ulscroll').width(width);

    //activate the marquee              
    marquee('.ulscroll', 1, false);
});

function marquee(id, speed, sub) {
    //next two lines debugging purposes only
    count += 1;
    log('Marquee ran ' + count + ' times');

    //store copy of speed sent it(to pass for recursion)
    var s1 = speed;
    //set speed to 10*
    speed = speed * 10;

    //store parent width, and own width (if sub then add on width of parent div)
    var pwidth = $(id).parent('div').outerWidth();
    var width = (sub ? $(id).width() + pwidth : $(id).width());

    //set timeout
    var t = (width - pwidth) * speed;
    setTimeout(function () {
        var clone = $(id).clone().css('left', pwidth);
        $(id).addClass('oldul');
        $(id).after(clone);
        marquee(id + ':not(.oldul)', s1, true);
    }, t);

    $(id).animate({
        left: '-=' + width
    }, width * speed, 'linear', function () {
        $(this).remove();
    });
}

function log(text) {
    $('#log').append('<div>' + text + '</div>');
}


Решение
Вопрос был вызван путем прохождения селектора в с: не (.ullold); Вот пересмотренный посел

setTimeout(function(){
  var clone = $(id).clone().css('left', pwidth);
  $(id).addClass('oldul');
  var idx = id.split(':');
  idx = idx[0];
  log('idx: '+idx);
  $(idx).after(clone);
  marquee(idx+':not(.oldul)', s1, true);
},t);
Это было полезно?

Решение

Проблема, скорее всего, ложь с этим кодом ..

    var clone = $(id).clone().css('left', pwidth);
    $(id).addClass('oldul');

Тот факт, что вы повторно используете селектор, портит вещи, потому что оригинальный селектор соответствует многое вещам, поскольку время прогрессирует ..

В исходном использовании вызова marquee('.ulscroll:not(.oldul)', 1, false);

Другие советы

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

Проблема с кодом на пробной странице (но не в указанном коде): tout локальный для каждого вызова marquee. Отказ То clearTimeout(tout) Вызов ничего не делает.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top