2023-01-23 11:03:31 +01:00

164 lines
5.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;(function (window) {
"use strict";
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 dont 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 its 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 () {
runner();
timer.id = setInterval(runner, interval);
}, interval - last);
} else {
runner();
timer.id = setInterval(runner, interval);
}
} else {
timer.id = setInterval(runner, interval);
}
};
// Stop timer from `every` method by its 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)
}
})(window);