Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.12.2015, 22:05
Аспирант
Отправить личное сообщение для Tord002 Посмотреть профиль Найти все сообщения от Tord002
 
Регистрация: 03.12.2014
Сообщений: 58

Ускоряется setInterval
Здравствуйте!
Есть функция которая меняет изображения (setInterval 1). Смена изображений происходит через определенное время (setInterval 2).
Работает! Но не корректно.
Если вкладка страницы открыта, но не активна скорость смены изображений начинает ускоряться в бесконечность.
Может кто-то сможет сказать почему так и это как это исправить?

var images = ['img/1.png', 'img/2.png', 'img/3.png', 'img/4.png', 'img/5.png'],
length = images.length,
index = 1;
function animate() {
id=setInterval (function()
{
if(index == length) index = 0;
document.getElementById('img').src = images[index++];
if(index == 5) clearInterval(id); // если достигнуто последнее изображение, то очищать setInterval
}, 65) // интервал смены изображений (setInterval 1)
}
setInterval(animate, 4500) // интервал между сменами изображений (setInterval 2)
Ответить с цитированием
  #2 (permalink)  
Старый 10.12.2015, 22:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Tord002,
попробуйте никогда не использовать setInterval в своих скриптах ... или хотябы научитесть обнулять предыдущий прежде чем запустить новый
Ответить с цитированием
  #3 (permalink)  
Старый 10.12.2015, 22:51
Аспирант
Отправить личное сообщение для Tord002 Посмотреть профиль Найти все сообщения от Tord002
 
Регистрация: 03.12.2014
Сообщений: 58

Пробую обнулить. Итог тот же

var images = ['img/1.png', 'img/2.png', 'img/3.png', 'img/4.png', 'img/5.png'],
length = images.length,
index = 1;

function animate() {
id1=setInterval (function()
{
if(index == length) index = 0;
document.getElementById('img').src = images[index++];
if(index == 5) clearInterval(id1);
}, 65) // интервал смены изображений (setInterval 1)
clearInterval(id2);
animate2();
}

function animate2() {
id2=setInterval(animate, 4500)
}
animate2();

Последний раз редактировалось Tord002, 10.12.2015 в 22:54.
Ответить с цитированием
  #4 (permalink)  
Старый 10.12.2015, 23:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Tord002,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #5 (permalink)  
Старый 10.12.2015, 23:14
Аспирант
Отправить личное сообщение для Tord002 Посмотреть профиль Найти все сообщения от Tord002
 
Регистрация: 03.12.2014
Сообщений: 58

Простите! Вот:

var images	= ['img/1.png', 'img/2.png', 'img/3.png', 'img/4.png', 'img/5.png'],
length = images.length,
index	= 1; 

function animate() {
id1=setInterval (function() 
{
if(index == length) index = 0;
document.getElementById('img').src = images[index++];
if(index == 5) clearInterval(id1);
}, 65) // интервал смены изображений (setInterval 1)
clearInterval(id2);
animate2();
}

function animate2() {
id2=setInterval(animate, 4500)
}
animate2();
Ответить с цитированием
  #6 (permalink)  
Старый 10.12.2015, 23:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Tord002,
и что хотите получить зачем два интервала?
Ответить с цитированием
  #7 (permalink)  
Старый 10.12.2015, 23:24
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Tord002,
может вы так хотели?
var images = ['img/1.png', 'img/2.png', 'img/3.png', 'img/4.png', 'img/5.png'],
 length = images.length,
 index = 1;

 function animate() {
 document.getElementById('img').src = images[index];
 index = ++index % length
 }

 setInterval(animate, 4500)
Ответить с цитированием
  #8 (permalink)  
Старый 11.12.2015, 00:01
Аспирант
Отправить личное сообщение для Tord002 Посмотреть профиль Найти все сообщения от Tord002
 
Регистрация: 03.12.2014
Сообщений: 58

Немного не так. В этом и проблема.
Нужно чтобы изображения менялись один цикл с интервалом, например 65
После это пауза - 4500. И цикл запускается снова.
Ответить с цитированием
  #9 (permalink)  
Старый 11.12.2015, 00:04
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Tord002, setTimeout тогда лучше.
Ответить с цитированием
  #10 (permalink)  
Старый 11.12.2015, 00:07
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Tord002,
var images = ['img/1.png', 'img/2.png', 'img/3.png', 'img/4.png', 'img/5.png'],
 length = images.length,
 index = 0;

 (function animate() {
 document.getElementById('img').src = images[index];
 index = ++index % length
 window.setTimeout(animate,index ? 65 : 4500)
 }())
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация JS WeMeSder Общие вопросы Javascript 0 13.06.2014 23:51
setInterval и глобальные переменные Почемучкин Events/DOM/Window 11 11.08.2012 14:44
Переменный в setinterval не видно вне него zeraid Общие вопросы Javascript 12 13.04.2011 10:29
setTimeout setInterval и др. mycoding Общие вопросы Javascript 6 28.10.2010 17:26
Проблема в document.write при использовании setInterval() GOll Общие вопросы Javascript 21 06.10.2008 17:38