189 行
6.4 KiB
JavaScript
189 行
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);
|