You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
4.6 KiB
131 lines
4.6 KiB
/*! |
|
* visibly - v0.7 Page Visibility API Polyfill |
|
* http://github.com/addyosmani |
|
* Copyright (c) 2011-2014 Addy Osmani |
|
* Dual licensed under the MIT and GPL licenses. |
|
* |
|
* Methods supported: |
|
* visibly.onVisible(callback) |
|
* visibly.onHidden(callback) |
|
* visibly.hidden() |
|
* visibly.visibilityState() |
|
* visibly.visibilitychange(callback(state)); |
|
*/ |
|
// https://raw.githubusercontent.com/addyosmani/visibly.js/5b271d2cf71dd21805b7dc0ded7ef97ac764307e/visibly.js |
|
;(function () { |
|
|
|
window.visibly = { |
|
q: document, |
|
p: undefined, |
|
prefixes: ['webkit', 'ms','o','moz','khtml'], |
|
props: ['VisibilityState', 'visibilitychange', 'Hidden'], |
|
m: ['focus', 'blur'], |
|
visibleCallbacks: [], |
|
hiddenCallbacks: [], |
|
genericCallbacks:[], |
|
_callbacks: [], |
|
cachedPrefix:"", |
|
fn:null, |
|
|
|
onVisible: function (_callback) { |
|
if(typeof _callback == 'function' ){ |
|
this.visibleCallbacks.push(_callback); |
|
} |
|
}, |
|
onHidden: function (_callback) { |
|
if(typeof _callback == 'function' ){ |
|
this.hiddenCallbacks.push(_callback); |
|
} |
|
}, |
|
getPrefix:function(){ |
|
if(!this.cachedPrefix){ |
|
for(var l=0;b=this.prefixes[l++];){ |
|
if(b + this.props[2] in this.q){ |
|
this.cachedPrefix = b; |
|
return this.cachedPrefix; |
|
} |
|
} |
|
} |
|
}, |
|
|
|
visibilityState:function(){ |
|
return this._getProp(0); |
|
}, |
|
hidden:function(){ |
|
return this._getProp(2); |
|
}, |
|
visibilitychange:function(fn){ |
|
if(typeof fn == 'function' ){ |
|
this.genericCallbacks.push(fn); |
|
} |
|
|
|
var n = this.genericCallbacks.length; |
|
if(n){ |
|
if(this.cachedPrefix){ |
|
while(n--){ |
|
this.genericCallbacks[n].call(this, this.visibilityState()); |
|
} |
|
}else{ |
|
while(n--){ |
|
this.genericCallbacks[n].call(this, arguments[0]); |
|
} |
|
} |
|
} |
|
|
|
}, |
|
isSupported: function (index) { |
|
return ((this._getPropName(2)) in this.q); |
|
}, |
|
_getPropName:function(index) { |
|
return (this.cachedPrefix == "" ? this.props[index].substring(0, 1).toLowerCase() + this.props[index].substring(1) : this.cachedPrefix + this.props[index]); |
|
}, |
|
_getProp:function(index){ |
|
return this.q[this._getPropName(index)]; |
|
}, |
|
_execute: function (index) { |
|
if (index) { |
|
this._callbacks = (index == 1) ? this.visibleCallbacks : this.hiddenCallbacks; |
|
var n = this._callbacks.length; |
|
while(n--){ |
|
this._callbacks[n](); |
|
} |
|
} |
|
}, |
|
_visible: function () { |
|
window.visibly._execute(1); |
|
window.visibly.visibilitychange.call(window.visibly, 'visible'); |
|
}, |
|
_hidden: function () { |
|
window.visibly._execute(2); |
|
window.visibly.visibilitychange.call(window.visibly, 'hidden'); |
|
}, |
|
_nativeSwitch: function () { |
|
this[this._getProp(2) ? '_hidden' : '_visible'](); |
|
}, |
|
_listen: function () { |
|
try { /*if no native page visibility support found..*/ |
|
if (!(this.isSupported())) { |
|
if (this.q.addEventListener) { /*for browsers without focusin/out support eg. firefox, opera use focus/blur*/ |
|
window.addEventListener(this.m[0], this._visible, 1); |
|
window.addEventListener(this.m[1], this._hidden, 1); |
|
} else { /*IE <10s most reliable focus events are onfocusin/onfocusout*/ |
|
if (this.q.attachEvent) { |
|
this.q.attachEvent('onfocusin', this._visible); |
|
this.q.attachEvent('onfocusout', this._hidden); |
|
} |
|
} |
|
} else { /*switch support based on prefix detected earlier*/ |
|
this.q.addEventListener(this._getPropName(1), function () { |
|
window.visibly._nativeSwitch.apply(window.visibly, arguments); |
|
}, 1); |
|
} |
|
} catch (e) {} |
|
}, |
|
init: function () { |
|
this.getPrefix(); |
|
this._listen(); |
|
} |
|
}; |
|
|
|
this.visibly.init(); |
|
})();
|
|
|