SetInterval в jQuery .each () - PullRequest
       1

SetInterval в jQuery .each ()

4 голосов
/ 19 апреля 2011

Я хочу перебрать группу div и выполнить несколько случайных действий в случайное время. Я пытаюсь использовать следующую функцию, но console.log возвращает один и тот же объект и целое число на каждой итерации. Как правильно выполнить следующее?

    $('.cloud').each(function() {
    $cloud = $(this);
    ranNum = Math.floor(Math.random() * 5000);
    setInterval(function() {
        setTimeout("console.log($cloud + ranNum)", ranNum)
    })
})          

Ответы [ 4 ]

9 голосов
/ 19 апреля 2011

Используйте локальные (закрывающие) переменные, используя var

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

$('.cloud').each(function() {
    var $cloud = $(this);
    var ranNum = Math.floor(Math.random() * 5000);
    setInterval(function() {
        // $cloud won't have any particular meaning though
        console.log($cloud + ranNum);
    }, ranNum);
});

Необычная комбинация setInterval и setTimeout

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

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

В вашей функции есть несколько ошибок, поэтому я собираюсь переписать и объяснить после:

$('.cloud').each(function(i,d) {
    var cloud = $(this);
    var randNum = Math.floor(Math.random() * 5000);

    setTimeout(function(){
        console.log(cloud + ranNum)
    }, randNum );
});

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

Если вы пытаетесь вывести на какое облако номеров вы ссылаетесь. Используйте i вместо cloud.

Попробуйте определить свои переменные немного чище, это не PHP, воздержитесь от использования $ и не забудьте var для начальных определений и; закончить заявления!

Надеюсь, это помогло.

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

Пожалуйста .. никогда не используйте строку в качестве первого аргумента setInterval / setTimeout

$('.cloud').each(function () {
    var $cloud = $(this);
    var ranNum = Math.floor(Math.random() * 5000);
    setTimeout(function () {
        console.log($cloud, ranNum);
    }, ranNum);
});
0 голосов
/ 19 апреля 2011

Здесь есть хорошие ответы.Я добавлю, что, поскольку вы не объявили ranNum, он становится глобальной переменной, и каждая итерация цикла будет перезаписывать предыдущее значение, а не создавать новую переменную.Таким образом, число, которое вы видите в выходных данных журнала, всегда будет тем случайным значением, которое было получено во время последней итерации цикла.

Итак, всегда объявляйте ваши переменные!

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