Просто слегка измененная версия подхода Aekeus.Теперь с таймерами паузы и возобновления, третьим arguments
и более быстрым callbacks
-циклом:
function Interval(callback, freq) {
// array of callback functions
var args = arguments,
callbacks = [callback],
paused = false;
// register the global timer
var id = setInterval(function () {
if(paused) return;
var len = callbacks.length,
i = len;
while(i--) callbacks[len - 1 - i].apply(Interval, Array.prototype.slice.call(args, 2, args.length));
}, freq);
// return a Global Timer object
return {
id: function () {
return id;
},
add: function (cb) {
callbacks.push(cb);
},
clear: function () {
if (id === null) return;
clearInterval(id);
id = null;
},
pause: function(){
paused = true;
},
resume: function(){
paused = false;
}
};
}
Вы можете передать extra - arguments
как по умолчанию setInterval
(даже в IE lt 9):
function callback(date) {
console.log(date);
}
var interval = Interval(callback, 1000, new Date);
Пример использования:
var interval = Interval(function () {
console.log("init", new Date);
}, 1000);
interval.add(function () {
console.log("a", new Date);
});
interval.add(function () {
console.log("b", new Date);
});
document.onmousedown = interval.pause;
document.onmouseup = interval.resume;