site-accueil-insa/matomo/node_modules/visibilityjs/lib/visibility.timers.js

161 行
5.1 KiB
JavaScript

;(function (window) {
var lastTimer = -1;
var install = function (Visibility) {
// Run callback every `interval` milliseconds if page is visible and
// every `hiddenInterval` milliseconds if page is hidden.
//
// Visibility.every(60 * 1000, 5 * 60 * 1000, function () {
// checkNewMails();
// });
//
// You can skip `hiddenInterval` and callback will be called only if
// page is visible.
//
// Visibility.every(1000, function () {
// updateCountdown();
// });
//
// It is analog of `setInterval(callback, interval)` but use visibility
// state.
//
// It return timer ID, that you can use in `Visibility.stop(id)` to stop
// timer (`clearInterval` analog).
// Warning: timer ID is different from interval ID from `setInterval`,
// so don’t use it in `clearInterval`.
//
// On change state from hidden to visible timers will be execute.
Visibility.every = function (interval, hiddenInterval, callback) {
Visibility._time();
if ( !callback ) {
callback = hiddenInterval;
hiddenInterval = null;
}
lastTimer += 1;
var number = lastTimer;
Visibility._timers[number] = {
visible: interval,
hidden: hiddenInterval,
callback: callback
};
Visibility._run(number, false);
if ( Visibility.isSupported() ) {
Visibility._listen();
}
return number;
};
// Stop timer from `every` method by it ID (`every` method return it).
//
// slideshow = Visibility.every(5 * 1000, function () {
// changeSlide();
// });
// $('.stopSlideshow').click(function () {
// Visibility.stop(slideshow);
// });
Visibility.stop = function(id) {
if ( !Visibility._timers[id] ) {
return false;
}
Visibility._stop(id);
delete Visibility._timers[id];
return true;
};
// Callbacks and intervals added by `every` method.
Visibility._timers = { };
// Initialize variables on page loading.
Visibility._time = function () {
if ( Visibility._timed ) {
return;
}
Visibility._timed = true;
Visibility._wasHidden = Visibility.hidden();
Visibility.change(function () {
Visibility._stopRun();
Visibility._wasHidden = Visibility.hidden();
});
};
// Try to run timer from every method by it’s ID. It will be use
// `interval` or `hiddenInterval` depending on visibility state.
// If page is hidden and `hiddenInterval` is null,
// it will not run timer.
//
// Argument `runNow` say, that timers must be execute now too.
Visibility._run = function (id, runNow) {
var interval,
timer = Visibility._timers[id];
if ( Visibility.hidden() ) {
if ( null === timer.hidden ) {
return;
}
interval = timer.hidden;
} else {
interval = timer.visible;
}
var runner = function () {
timer.last = new Date();
timer.callback.call(window);
}
if ( runNow ) {
var now = new Date();
var last = now - timer.last ;
if ( interval > last ) {
timer.delay = setTimeout(function () {
timer.id = setInterval(runner, interval);
runner();
}, interval - last);
} else {
timer.id = setInterval(runner, interval);
runner();
}
} else {
timer.id = setInterval(runner, interval);
}
};
// Stop timer from `every` method by it’s ID.
Visibility._stop = function (id) {
var timer = Visibility._timers[id];
clearInterval(timer.id);
clearTimeout(timer.delay);
delete timer.id;
delete timer.delay;
};
// Listener for `visibilitychange` event.
Visibility._stopRun = function (event) {
var isHidden = Visibility.hidden(),
wasHidden = Visibility._wasHidden;
if ( (isHidden && !wasHidden) || (!isHidden && wasHidden) ) {
for ( var i in Visibility._timers ) {
Visibility._stop(i);
Visibility._run(i, !isHidden);
}
}
};
return Visibility;
}
if ( typeof(module) != 'undefined' && module.exports ) {
module.exports = install(require('./visibility.core'));
} else {
install(window.Visibility || require('./visibility.core'))
}
})(window);