Есть ли надежный способ определить, неактивна ли вкладка или окно браузера или нет? - PullRequest
8 голосов
/ 31 июля 2009

У меня есть таймер JavaScript, который делает запросы XMLHTTP на постоянной основе (один раз каждые 10 секунд). Я хотел бы иметь возможность приостановить таймер, когда окно или вкладка теряет фокус.

Я полностью осведомлен о событиях onFocus и onBlur объекта window, но они не работают надежно во всех браузерах. Например, в Safari вкладки не вызывают события .

Простой код ниже показывает нужную мне функциональность:

<html>
  <head>
    <title>Testing</title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"></script>
  </head>
  <body>
    <div id="console"></div>
    <script type="text/javascript">
      window.onfocus = function(event) {
        $('console').insert('Window gained focus<br />');
      }

      window.onblur = function(event) {
        $('console').insert('Window lost focus<br />');
      }
    </script>
  </body>
</html>

Есть ли у кого-нибудь методика определения, когда окно или вкладка браузера теряет / получает фокус, который работает во всех популярных браузерах?

Ответы [ 5 ]

3 голосов
/ 18 октября 2009

Приведенный выше код отлично работает в Safari v3.0.4 (WebKit 530+), похоже, ошибка устранена. Я проверил это в Google Chrome v3.0.195.27, и у него та же ошибка Safari, хотя у него более новая версия WebKit.

2 голосов
/ 31 июля 2009

Есть еще один вопрос переполнения стека по этой теме. Они не решали проблему просмотра с вкладками. Они дают ссылку, в которой есть некоторые детали, но без использования jquery.

Есть ли способ обнаружить, если окно браузера не активно в данный момент?

Я не думаю, что события фокусировки / размытия вообще работают с просмотром вкладок в Safari. Некоторые люди предлагают для этого события мыши, например mouseleave / mouseenter.

У меня есть некоторые проблемы с пользовательским интерфейсом, подобные этим, поэтому, если я что-то обнаружу, я буду следить здесь.

0 голосов
/ 02 июля 2014
<script>

    // Adapted slightly from Sam Dutton
    // Set name of hidden property and visibility change event
    // since some browsers only offer vendor-prefixed support
    var hidden, state, visibilityChange; 
    if (typeof document.hidden !== "undefined") {
        hidden = "hidden";
        visibilityChange = "visibilitychange";
        state = "visibilityState";
    } else if (typeof document.mozHidden !== "undefined") {
        hidden = "mozHidden";
        visibilityChange = "mozvisibilitychange";
        state = "mozVisibilityState";
    } else if (typeof document.msHidden !== "undefined") {
        hidden = "msHidden";
        visibilityChange = "msvisibilitychange";
        state = "msVisibilityState";
    } else if (typeof document.webkitHidden !== "undefined") {
        hidden = "webkitHidden";
        visibilityChange = "webkitvisibilitychange";
        state = "webkitVisibilityState";
    }

    // Add a listener that constantly changes the title
    document.addEventListener(visibilityChange, function() {
        document.title = document[state];
    }, false);

    // Set the initial value
    document.title = document[state];

</script>
0 голосов
/ 31 июля 2009

Следует учесть, что tab focus / blur события, блокируемые поставщиками браузеров, возможно, способ защитить пользователей. Некоторые браузеры допускают всплывающие окна в стиле alert() (и даже, я полагаю, метод focus()), чтобы заставить вкладку восстановить фокус. Блокировка событий focus / blur для переключения вкладок может быть похожа на защиту, например, от незапрошенных всплывающих окон и размеров окна / позиционирования / закрытия.

0 голосов
/ 31 июля 2009

Мои предыдущие отчаянные попытки найти такую ​​вещь привели меня к выводу, что такого животного нет.

О, как бы мне хотелось быть неправым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...