forked from vergnet/site-accueil-insa
189 lines
6.4 KiB
JavaScript
189 lines
6.4 KiB
JavaScript
;(function (global) {
|
||
var lastId = -1;
|
||
|
||
// Visibility.js allow you to know, that your web page is in the background
|
||
// tab and thus not visible to the user. This library is wrap under
|
||
// Page Visibility API. It fix problems with different vendor prefixes and
|
||
// add high-level useful functions.
|
||
var self = {
|
||
|
||
// Call callback only when page become to visible for user or
|
||
// call it now if page is visible now or Page Visibility API
|
||
// doesn’t supported.
|
||
//
|
||
// Return false if API isn’t supported, true if page is already visible
|
||
// or listener ID (you can use it in `unbind` method) if page isn’t
|
||
// visible now.
|
||
//
|
||
// Visibility.onVisible(function () {
|
||
// startIntroAnimation();
|
||
// });
|
||
onVisible: function (callback) {
|
||
var support = self.isSupported();
|
||
if ( !support || !self.hidden() ) {
|
||
callback();
|
||
return support;
|
||
}
|
||
|
||
var listener = self.change(function (e, state) {
|
||
if ( !self.hidden() ) {
|
||
self.unbind(listener);
|
||
callback();
|
||
}
|
||
});
|
||
return listener;
|
||
},
|
||
|
||
// Call callback when visibility will be changed. First argument for
|
||
// callback will be original event object, second will be visibility
|
||
// state name.
|
||
//
|
||
// Return listener ID to unbind listener by `unbind` method.
|
||
//
|
||
// If Page Visibility API doesn’t supported method will be return false
|
||
// and callback never will be called.
|
||
//
|
||
// Visibility.change(function(e, state) {
|
||
// Statistics.visibilityChange(state);
|
||
// });
|
||
//
|
||
// It is just proxy to `visibilitychange` event, but use vendor prefix.
|
||
change: function (callback) {
|
||
if ( !self.isSupported() ) {
|
||
return false;
|
||
}
|
||
lastId += 1;
|
||
var number = lastId;
|
||
self._callbacks[number] = callback;
|
||
self._listen();
|
||
return number;
|
||
},
|
||
|
||
// Remove `change` listener by it ID.
|
||
//
|
||
// var id = Visibility.change(function(e, state) {
|
||
// firstChangeCallback();
|
||
// Visibility.unbind(id);
|
||
// });
|
||
unbind: function (id) {
|
||
delete self._callbacks[id];
|
||
},
|
||
|
||
// Call `callback` in any state, expect “prerender”. If current state
|
||
// is “prerender” it will wait until state will be changed.
|
||
// If Page Visibility API doesn’t supported, it will call `callback`
|
||
// immediately.
|
||
//
|
||
// Return false if API isn’t supported, true if page is already after
|
||
// prerendering or listener ID (you can use it in `unbind` method)
|
||
// if page is prerended now.
|
||
//
|
||
// Visibility.afterPrerendering(function () {
|
||
// Statistics.countVisitor();
|
||
// });
|
||
afterPrerendering: function (callback) {
|
||
var support = self.isSupported();
|
||
var prerender = 'prerender';
|
||
|
||
if ( !support || prerender != self.state() ) {
|
||
callback();
|
||
return support;
|
||
}
|
||
|
||
var listener = self.change(function (e, state) {
|
||
if ( prerender != state ) {
|
||
self.unbind(listener);
|
||
callback();
|
||
}
|
||
});
|
||
return listener;
|
||
},
|
||
|
||
// Return true if page now isn’t visible to user.
|
||
//
|
||
// if ( !Visibility.hidden() ) {
|
||
// VideoPlayer.play();
|
||
// }
|
||
//
|
||
// It is just proxy to `document.hidden`, but use vendor prefix.
|
||
hidden: function () {
|
||
return !!(self._doc.hidden || self._doc.webkitHidden);
|
||
},
|
||
|
||
// Return visibility state: 'visible', 'hidden' or 'prerender'.
|
||
//
|
||
// if ( 'prerender' == Visibility.state() ) {
|
||
// Statistics.pageIsPrerendering();
|
||
// }
|
||
//
|
||
// Don’t use `Visibility.state()` to detect, is page visible, because
|
||
// visibility states can extend in next API versions.
|
||
// Use more simpler and general `Visibility.hidden()` for this cases.
|
||
//
|
||
// It is just proxy to `document.visibilityState`, but use
|
||
// vendor prefix.
|
||
state: function () {
|
||
return self._doc.visibilityState ||
|
||
self._doc.webkitVisibilityState ||
|
||
'visible';
|
||
},
|
||
|
||
// Return true if browser support Page Visibility API.
|
||
// refs: https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API
|
||
//
|
||
// if ( Visibility.isSupported() ) {
|
||
// Statistics.startTrackingVisibility();
|
||
// Visibility.change(function(e, state)) {
|
||
// Statistics.trackVisibility(state);
|
||
// });
|
||
// }
|
||
isSupported: function () {
|
||
return self._doc.hidden !== undefined || self._doc.webkitHidden !== undefined;
|
||
},
|
||
|
||
// Link to document object to change it in tests.
|
||
_doc: document || {},
|
||
|
||
// Callbacks from `change` method, that wait visibility changes.
|
||
_callbacks: { },
|
||
|
||
// Listener for `visibilitychange` event.
|
||
_change: function(event) {
|
||
var state = self.state();
|
||
|
||
for ( var i in self._callbacks ) {
|
||
self._callbacks[i].call(self._doc, event, state);
|
||
}
|
||
},
|
||
|
||
// Set listener for `visibilitychange` event.
|
||
_listen: function () {
|
||
if ( self._init ) {
|
||
return;
|
||
}
|
||
|
||
var event = 'visibilitychange';
|
||
if ( self._doc.webkitVisibilityState ) {
|
||
event = 'webkit' + event;
|
||
}
|
||
|
||
var listener = function () {
|
||
self._change.apply(self, arguments);
|
||
};
|
||
if ( self._doc.addEventListener ) {
|
||
self._doc.addEventListener(event, listener);
|
||
} else {
|
||
self._doc.attachEvent(event, listener);
|
||
}
|
||
self._init = true;
|
||
}
|
||
|
||
};
|
||
|
||
if ( typeof(module) != 'undefined' && module.exports ) {
|
||
module.exports = self;
|
||
} else {
|
||
global.Visibility = self;
|
||
}
|
||
|
||
})(this);
|