2012-02-19 4 views
0

Я написал код javascript, чтобы показывать пользователям случайную цитату каждые 10 секунд. Я использую jquery для обновления div и setInterval для повторения действия. Я получаю случайную цитату из массива javascript.Почему setInterval не работает должным образом через какое-то время?

Но когда я протестировал это, кажется, что он не работает должным образом через некоторое время (например, 3-5 минут), у меня есть некоторые эффекты jquery, такие как fadeIn и fadeOut, но они выполняются до изменения котировки. Вот код js;

var quotes = [ 
    "Some String", 
    "Some String", 
    "Some String" 
]; 

$(function() { 
    var $rand = $('div#randomQuote > p'); 
    var random_quote = quotes[Math.floor(Math.random() * quotes.length)];  
    $rand.html(random_quote); 
    $rand.animate({"opacity" : 0}, 0); 
    $rand.animate({"opacity" : 1}, 500); 
    $rand.delay("9000"); 
    $rand.animate({ "opacity" : 0 }, 500);  
}); 


function randomQuote() { 
    var $rand = $('div#randomQuote > p'); 
    var random_quote = quotes[Math.floor(Math.random() * quotes.length)]; 
    $rand.html(random_quote); 
    $rand.animate({"opacity" : 1}, 500); 
    $rand.delay("9000"); 
    $rand.animate ({"opacity" : 0}, 500); 
} 

$(function() { 
    setInterval(randomQuote, 10000); 
}); 

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

var $rand = $('div#randomQuote > p'); 
var random_quote = quotes[Math.floor(Math.random() * quotes.length)]; 

Q: Как я могу улучшить этот код, чтобы заставить его работать, как ожидалось?

Заранее спасибо.

+0

Возможно, проблема заключается не в вашем коде. Часто браузер не выполняет сценарии (и, следовательно, анимации), когда окно не сфокусировано. Вы должны рассмотреть возможность остановки всех анимаций в событии 'blur' в окне и перезапустить его на' focus'. – RoToRa

+0

Codereview предназначен для отзывов о рабочем коде. Не для того, чтобы получить помощь, чтобы заставить код работать. Для таких вопросов вы должны перейти в Stack Overflow (где я сейчас переведу этот вопрос). – sepp2k

ответ

1

Таким образом ваша очередь событий будет расти бесконечно. То, что вы хотите использовать в этом случае, вероятно, установлено вTimeout вместо setInterval. Я предлагаю попробовать эту ссылку: http://ejohn.org/blog/how-javascript-timers-work/

+0

спасибо за то, что нашли время, , но, с setTimeout, моя функция запускается только один раз, где я хочу, чтобы она зацикливалась навсегда –

+0

oh wait, я вижу аргументы.callee в вашей ссылке, теперь она работает так, как я хочу, я буду тестировать и дайте знать, как это произошло :) –

+0

Обратите внимание, что setTimeout в примере называется рекурсивно, в отличие от setInterval. –

Смежные вопросы