Иногда встречаются задачи, когда желательно не выполнять действия на сайте в нескольких вкладках одновременно.
Это включает в себя различные глобальные уведомления, особенно в случае, если они вызывают проигрывание звуков или другие жестокие по отношению к пользователю, либо тяжелые операции (в случае одновременного их выполнения в десятке-другой вкладок).
С тех пор, как старые IE стали уходить со сцены, это стало выполнить намного проще.
JSON и localStorage доступны начиная с IE версии 8.
Общее покрытие — примерно 93.96%:
caniuse.com/#feat=namevalue-storage
caniuse.com/#feat=json
Предлагаю вашему вниманию легкий скрипт, предоставляющий следующий интерфейс:
if (olamedia.leader && olamedia.leader.isLeader()){
// здесь выполняются общие для вкладок операции
}
if (olamedia.leader){
olamedia.leader.onChange(function(leader){
console.log('Новый лидер', leader);
});
}
Проверка доступности (доступен если есть поддержка JSON и localStorage):
if (olamedia.leader){
}
Скрипт отслеживает активность, подписываясь как на старые события типа фокуса окна, нажатия клавиш, наведение мыши, так и новейшие, такие как visibilitychange. При этом запись в localStorage (список нужен для мгновенного выбора лидера при закрытии одной из вкладок) осуществляется не чаще, чем раз в 10 секунд, если вкладка уже выбрана.
Закрытие окна отслеживается с помощью beforeunload.
Лицензия MIT.
github.com/olamedia/leader-js
github.com/olamedia/olamedia-js (зависимость/пространство имен, MIT)