• 如何监听页面可见性,如处于后台、标签页切换、最小化、锁屏


    1. // 是否是safari浏览器
    2. const IS_SAFARI = typeof safari === 'object' && safari.pushNotification;
    3. /**
    4. * 监听dom状态
    5. * @param { function } showCallback:页面在前景标签页中,并且窗口没有最小化时,的回调函数
    6. * @param { function } hideCallback: 标签页处于后台时、窗口被最小化时、设备的屏幕被关闭时,的回调函数
    7. */
    8. const ListenDocuemntState = function (showCallback, hideCallback){
    9. let _showCallback = showCallback || function(){ };
    10. let _hideCallback = hideCallback || function(){ };
    11. const visibilitychangeHandel = () => {
    12. /** 当:
    13. * document的标签页处于后台
    14. * 窗口被最小化
    15. * 设备的屏幕被关闭。
    16. */
    17. if(document.visibilityState === 'hidden'){
    18. _hideCallback()
    19. }
    20. /**
    21. * 当:页面内容至少是部分可见. 即此页面在前景标签页中,并且窗口没有最小化
    22. */
    23. else if(document.visibilityState === 'visible'){
    24. // 定时器的原因是想页面第一次渲染完毕后触发
    25. setTimeout(() => _showCallback(), 0)
    26. }
    27. }
    28. const pagehideHandel = () => _hideCallback();
    29. document.addEventListener('visibilitychange', visibilitychangeHandel, false);
    30. //Safari浏览器在页面hidden时存在兼容问题
    31. if ( IS_SAFARI ) window.addEventListener('pagehide', pagehideHandel);
    32. return {
    33. reomve: function(){
    34. document.removeEventListener('visibilitychange', visibilitychangeHandel);
    35. if ( IS_SAFARI ) window.addEventListener('pagehide', pagehideHandel);
    36. }
    37. }
    38. }
    39. export default ListenDocuemntState;

    使用方法:

    1. import ListenDocuemntState from 'ListenDocuemntState'
    2. const listen = ListenDocuemntState (()=>{
    3. // 页面可见了 dosomething...
    4. }, ()=>{
    5. // 页面不可见了 dosomething...
    6. })
    7. // 移除
    8. listen.remove()

    另外推荐一个由谷歌团队维护的页面生命周期的方案:https://github.com/GoogleChromeLabs/page-lifecycle

    它所提供的全面的生命周期:

    • ACTIVE 激活
    • PASSIVE 未激活(页面可以看到,但焦点不在此页面,打开开发者工具可以触发此状态)
    • HIDDEN 隐藏,最小化、标签页切换都属于隐藏
    • FROZEN 冻结
    • TERMINATED 结束 (页面被关闭)
    • DISCARDED 废弃(页面内容被浏览器清空)

    其中,从 HIDDEN 状态到 FROZEN 状态之间的变化是有新的 API 事件名称检测的,分别是 resume 事件和 freeze 事件,使用示意如下:

    1. document.addEventListener('freeze', (event) => {
    2. // 页面被冻结
    3. });
    4. document.addEventListener('resume', (event) => {
    5. // 页面解冻了
    6. });

    例如,我们希望页面离开时候上报数据,可以试试下面的代码,理论上应该是没问题的:

    1. lifecycle.addEventListener('statechange', function(event) {
    2. if (event.oldState == 'passive' && event.newState == 'hidden') {
    3. navigator.sendBeacon('/log', postData);
    4. }
    5. });

  • 相关阅读:
    一代人有一代人的使命
    移动硬盘误删除要如何恢复呢?
    面试官问你的项目经验,这样说指定给你加分
    多线程-线程池-划重点后面要考
    SpringBoot:Web开发之Filter实践
    3-爬虫-搜索文档树(find和find_all)、bs4其它用法、css选择器、selenium基本使用以及其他、selenium(无头浏览器、搜索标签)
    行走的offer收割机,这份十万字Java面试总结已经帮助上百人拿到大厂offer,还不快冲?
    【Java Web】论坛——我收到的赞
    1、8复合选择器总结
    Unity关键词语音识别
  • 原文地址:https://blog.csdn.net/HuaiCheng9067/article/details/126320743