discourse/app/assets/javascripts/discourse/initializers/focus-event.js.es6

71 lines
1.9 KiB
Plaintext
Raw Normal View History

/**
Keep track of when the browser is in focus.
**/
export default {
name: 'focus-event',
initialize: function() {
var hidden = "hidden";
// Default to true
Discourse.set('hasFocus', true);
var gotFocus = function() {
if(!Discourse.get('hasFocus')){
Discourse.setProperties({hasFocus: true, notify: false});
}
};
var lostFocus = function() {
if(Discourse.get('hasFocus')) {
Discourse.set('hasFocus', false);
}
};
var onchange = function(evt) {
var v = 'visible', h = 'hidden',
evtMap = {
focus:v, focusin:v, pageshow:v, blur:h, focusout:h, pagehide:h
};
evt = evt || window.event;
if (evt.type in evtMap){
if(evtMap[evt.type] === 'hidden') {
lostFocus();
} else {
gotFocus();
}
}
else {
if(this[hidden]) {
lostFocus();
} else {
gotFocus();
}
}
};
// from StackOverflow http://stackoverflow.com/a/1060034/17174
if (hidden in document) {
document.addEventListener('visibilitychange', onchange);
}
else if ((hidden = 'mozHidden') in document) {
document.addEventListener('mozvisibilitychange', onchange);
}
else if ((hidden = 'webkitHidden') in document) {
document.addEventListener('webkitvisibilitychange', onchange);
}
else if ((hidden = 'msHidden') in document) {
document.addEventListener('msvisibilitychange', onchange);
}
// IE 9 and lower:
else if ('onfocusin' in document) {
document.onfocusin = document.onfocusout = onchange;
}
// All others (including iPad which is a bit weird and gives onpageshow / hide
else {
window.onpageshow = window.onpagehide = window.onfocus = window.onblur = onchange;
}
}
};