Сообщение от Kosty@n
|
Здравствуйте, уважаемые пользователи.
У меня на странице в разное время запускаются функции setInterval, которые реализуют мигание некоторых объектов на странице.
Как синхронизировать работу этих setInterval'ов?
Пример кода.
setInterval(function() {
play();
} , 500);
function play() {
for (obj in Example[iter]) {
//здесь что-то происходит
}
iter += 1;
}
Помогите интеллектом, кто сколько может
|
сюда отлично подойдёт реализация requestAnimationFrame для браузеров, которые не имеют реализации оной
только что заметил, что тут не хватает нескольких функций \ переменных, но я думаю, что их название говорит само за себя.
идея в том, чтобы собрать функции в массив, а потом через время ( 1000 / 60 ) обойти этот массив и каждой передать одинаковую метку времени - Date.now().
// ....................................
/**
* Вернёт кол-во миллисекунд с 1 Января 1970 00:00:00 UTC
* @return {number}
*/
var now = Date.now || function () {
return +new Date;
};
/**
* Замена для requestAnimationFrame.
* @param {function(number)} callback
* @return {number} ID таймаута
*/
function rAF_imitation(callback) {
var id = rAF_imitation.unique++,
info = {
id:id,
func:callback
};
if (!rAF_imitation.timerID) rAF_imitation.timerID = setInterval(rAF_imitation.looper, 1e3 / FRAMES_PER_SECOND);
rAF_imitation.queue.push(info);
return id;
}
/**
* Замена для cancelRequestAnimationFrame
* @param {number} id
*/
function rAF_imitation_dequeue(id) {
var index, queue, eq;
eq = function (/**@type {{id: number, func: Function}}*/val) {
return val.id === id;
};
queue = rAF_imitation.queue;
index = LinearSearch(/**@type {Array}*/(queue), eq);
if (index !== -1) {
// don't splice
queue[index] = null;
}
}
/**
* ID таймаута "перерисовки"
* @type {number}
* @private
*/
rAF_imitation.timerID = null;
/**
* Для генерации ID таймаута.
* @type {Number}
*/
rAF_imitation.unique = 0;
/**
* Очередь обработчиков и их контекстов
* @type {Array.<{func: Function, id: number}>}
* @const
*/
rAF_imitation.queue = [];
/**
* Таймер "отрисовки" - пройдется по обработчикам и повызывает их,
* передав как первый аргумент временную метку "отрисовки"
* @private
*/
rAF_imitation.looper = function () {
var reflowTimeStamp = now(), queue = rAF_imitation.queue, info;
while (queue.length) {
info = queue.pop();
info && info.func.call(window, reflowTimeStamp);
}
};