Замечали ли вы, когда в соседней вкладке открыта Яндекс почта и приходит письмо, JS проигрывает короткий звук, а favicon вкладки меняется на цифру. Это очень удобно и позволяет быть достаточно оперативным, не используя сомнительный почтовый софт (привет тумберберд).
Похожая ситуация с Контактом. Когда вы не просматриваете страницу или вообще когда свернули браузер.
Как это работает?
Раньше, мы использовали хитрости вроде
$(window).on('mousemove', function () {})
Если мышка над вкладкой то все ок. Если нет то выдаем сообщение. Это работает, но с известной долей ошибок.
на дворе 2015 год и давно появились специальные события браузера, которые сигнализируют нам о нужном событии.
window.onChangeVisibility = function (callback) {
var hidden, visibilityChange;
if (typeof document.hidden !== "undefined") {
hidden = "hidden";
visibilityChange = "visibilitychange";
} else if (typeof document.mozHidden !== "undefined") {
hidden = "mozHidden";
visibilityChange = "mozvisibilitychange";
} else if (typeof document.msHidden !== "undefined") {
hidden = "msHidden";
visibilityChange = "msvisibilitychange";
} else if (typeof document.webkitHidden !== "undefined") {
hidden = "webkitHidden";
visibilityChange = "webkitvisibilitychange";
}
function handleVisibilityChange() {
if (callback && callback.call) {
callback.call(_this, document[hidden]);
}
}
if (typeof document.addEventListener === "undefined"
|| typeof document[hidden] === "undefined") {
return;
}
document.addEventListener(visibilityChange, handleVisibilityChange, false);
}
Со строки 3 по 10 мы выбираем нужные вендорные префиксы. Дело в том, что разные браузеры вводили эту функцию по разному и пока не пришли к общему решению. Поэтому не заморачивайтесь. Просто скопируйте эту часть кода.
Далее, мы проверяем существует ли у документа метод addEventListener. Его может не быть в старых версиях IE. В этом случае пользователю уже ничего не поможет)
Далее вешаем стандартным образом обработчик на событие hidden.
Как пользоваться
onChangeVisibility(function (hidden) {
if (hidden) {
changeIcon('ring.png')
} else {
changeIcon('favicon.ico')
}
});
Когда вы свернете вкладку, вызовется функция changeIcon. Она сменит favicon вкладки и пользователь узнает о том, что мы по нему скучаем =)
Осталось написать changeIcon
changeIcon = function (src) {
if (!document.head) {
document.head = document.getElementsByTagName('head')[0];
}
var link = null,
oldLink = document.getElementById('dynamic-favicon');
if (src) {
link = document.createElement('link');
link.id = 'dynamic-favicon';
link.rel = 'shortcut icon';
link.href = src;
}
if (oldLink) {
document.head.removeChild(oldLink);
}
if (link) {
document.head.appendChild(link);
}
}
А как же сигнал? Звуковой сигнал, который играет когда приходит письмо в Яндекс Почте.
Это тоже весьма просто.
function checkEmail() {
$.getJSON('index.php?action=checkemail', function(resp){
if (resp.hasNewEmails) {
changeIcon('ring.png');
var audio = new Audio('ring.mp3');
audio.play();
}
});
}
var interval = 0;
onChangeVisibility(function (hidden){
clearInterval(interval);
if (hidden) {
interval = setInterval(checkEmail, 5000);
}
});
При сворачивании вкладки, или при переходе на другую, обработчик запускает циклически функцию checkEmail. Если сервер сообщил о новом письме, то проигрывает мелодию ring.mp3
Как только вкладка развернута, цикл уничтожается. Так оно и работает. Для большего эффекта можно воспользоваться мелодией ramstain.mp3 =)
Всего доброго!

