visibility

通过 visibilityState 的值检测页面当前是否可见,以及打开网页的时间等;
Page Visibility API,主要有三部分组成:

  • document.hidden:表示页面是否隐藏的布尔值。页面隐藏包括 页面在后台标签页中 或者 浏览器最小化
  • document.visibilityState:表示下面 4 个可能状态的值
    • hidden:页面在后台标签页中或者浏览器最小化
    • visible:页面在前台标签页中
    • prerender:页面在屏幕外执行预渲染处理 document.hidden 的值为 true
    • unloaded:页面正在从内存中卸载
  • Visibilitychange 事件:当文档从可见变为不可见或者从不可见变为可见时,会触发该事件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    document.addEventListener('visibilitychange', function() {
    var isHidden = document.hidden;
    if (isHidden) {
    // 动画停止
    // 服务器轮询停止 等等
    } else {
    // 动画开始
    // 服务器轮询
    }
    });
    -----------
    //兼容性写法
    (function() {
    var hidden = "hidden";

    // 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);
    // IE 9 and lower:
    else if ("onfocusin" in document)
    document.onfocusin = document.onfocusout = onchange;
    // All others:
    else
    window.onpageshow = window.onpagehide
    = window.onfocus = window.onblur = onchange;

    function onchange (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)
    document.body.className = evtMap[evt.type];
    else
    document.body.className = this[hidden] ? "hidden" : "visible";
    }

    // set the initial state (but only if browser supports the Page Visibility API)
    if( document[hidden] !== undefined )
    onchange({type: document[hidden] ? "blur" : "focus"});
    })();