Is there a way to detect if a browser window is not currently active?

前端 未结 19 2110
无人共我
无人共我 2020-11-21 04:40

I have JavaScript that is doing activity periodically. When the user is not looking at the site (i.e., the window or tab does not have focus), it\'d be nice to not run.

19条回答
  •  梦如初夏
    2020-11-21 04:42

    For angular.js, here is a directive (based on the accepted answer) that will allow your controller to react to a change in visibility:

    myApp.directive('reactOnWindowFocus', function($parse) {
        return {
            restrict: "A",
            link: function(scope, element, attrs) {
                var hidden = "hidden";
                var currentlyVisible = true;
                var functionOrExpression = $parse(attrs.reactOnWindowFocus);
    
              // Standards:
              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);
              else if ("onfocusin" in document) {
                    // IE 9 and lower:
                document.onfocusin = onshow;
                    document.onfocusout = onhide;
              } else {
                    // All others:
                window.onpageshow = window.onfocus = onshow;
                    window.onpagehide = window.onblur = onhide;
                }
    
              function onchange (evt) {
                    //occurs both on leaving and on returning
                    currentlyVisible = !currentlyVisible;
                    doSomethingIfAppropriate();
              }
    
                function onshow(evt) {
                    //for older browsers
                    currentlyVisible = true;
                    doSomethingIfAppropriate();
                }
    
                function onhide(evt) {
                    //for older browsers
                    currentlyVisible = false;
                    doSomethingIfAppropriate();
                }
    
                function doSomethingIfAppropriate() {
                    if (currentlyVisible) {
                        //trigger angular digest cycle in this scope
                        scope.$apply(function() {
                            functionOrExpression(scope);
                        });
                    }
                }
            }
        };
    
    });
    

    You can use it like this example:

    , where refresh() is a scope function in the scope of whatever Controller is in scope.

提交回复
热议问题