前言

有时候我们会需要知道当前页面是否处于活动的状态,一般应用有:

1、页面有视频播放,用户暂时离开了当前页面,如何判断让播放器暂停。

2、拉取式的消息轮询api请求,如何在用户不处于页面活动状态时暂停对api的请求。

原理

从浏览器是否切换标签页和浏览器是否切屏两个方面共同监听,输出状态,使用时获取这个状态。

封装JS

page-visibility-state.js

var pvs = {
    visible: true,
    listener: function (callback, visibleCallback, hiddenCallback) {
        var that = this;
        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";
        }

        //添加监听器,监听当前是否活动页面
        document.addEventListener(visibilityChange, function() {
            var state = document[state];
            var visible = state == 'visible';
            that.visible = visible;
            if (callback) {
                callback(state, visible);
            }
            if (visibleCallback) {
                visibleCallback();
            }
            if (hiddenCallback) {
                hiddenCallback();
            }
        }, false);
        window.onblur = () => {
            that.visible = false;
            if (callback) {
                callback('visible', false);
            }
            if (hiddenCallback) {
                hiddenCallback();
            }
        }
        window.onfocus = () => {
            that.visible = true;
            if (callback) {
                callback('hidden', true);
            }
            if (visibleCallback) {
                visibleCallback();
            }
        }
    }
};

示例

以页面活动时轮询调用api为例

1、引用js

<script src="/path/to/page-visibility-state.js"></script>

2、代码
//你的获取消息ajax调用方法
function getMessages() {
    $.ajax({
        type : "POST",
        contentType: "application/json;charset=UTF-8",
        url : "/path/to/messages",
        data : {},
        success : function(result) {
            /**
             * 你的逻辑代码
             */

            //判断状态是否为当前活动的
            if (pvs.visible) {
                setTimeout(function () {
                    getMessages();
                }, 1000);
            }
        },
        error : function(e){
        }
    });
}
//调用监听
pvs.listener(function (state, visible) {
    //活动状态变更时就会执行
    //state参数,值为:"visible" 和 "hidden"
    //visible参数,值为:true 和 false
}, function () {
    //活动状态变更为活动页时执行
    getMessages();
}, function () {
    //活动状态变更为不是活动页时执行
});
最后修改:2022 年 04 月 21 日 10 : 40 AM
如果觉得我的文章对你有用,请随意赞赏