zoukankan      html  css  js  c++  java
  • visibilityChange api的使用场景及在react中的使用

    visibilityChange api的使用场景

    场景

    • 最近在做网页版视频编辑器相关的工作,页面视频会自动重复的播放,但是发现在页面切换后,音视频还是在自动播放,感觉非常不合理
    • 在没有在当前页面停留时,页面还是不停的请求资源,造成了很大的浪费
    • 后面就发现visibilityChange能够很好的解决这个问题,是用来判断是否在当前页面

    visibilityChange api 文档

    • mdn文档
    • 提供了您可以观察的事件,以便了解文档何时可见或隐藏,以及查看页面当前可见性状态的功能
    • HTML5中的新特性,如果需要兼容老版本浏览器慎用

    demo

      // app.js
      import React from 'react'
      import useVisibility from './visibilityChange'
    
      export default function App() {
        const videoElement = document.getElementById('video')
        // 直接调用即可
        useVisibility(videoElement)
    
        return (
          <div className='App'>
            <h1>visibilityChange api在react的使用</h1>
            <video
              autoplay
              loop
              id='video'
              src={
                'https://s3-ap-northeast-1.amazonaws.com/daniemon/demos/The%2BVillage-Mobile.mp4'
              }
              controls='controls'
              width={500}
              height={300}
            />
          </div>
        );
      }
    
      // visibilityChange.js
    
      /**
      * 处理切换页面后视频暂停播放
      * @param {视频的ele} videoElement 
      */
      function useVisibility(videoElement) {
        var hidden, visibilityChange
        if (typeof document.hidden !== 'undefined') { // Opera 12.10 and Firefox 18 and later support 
          hidden = 'hidden'
          visibilityChange = 'visibilitychange'
        } else if (typeof document.msHidden !== 'undefined') {
          hidden = 'msHidden'
          visibilityChange = 'msvisibilitychange'
        } else if (typeof document.webkitHidden !== 'undefined') {
          hidden = 'webkitHidden'
          visibilityChange = 'webkitvisibilitychange'
        }
    
        const handleVisibilityChange = () => {
          if (document[hidden]) {
            videoElement && videoElement.pause()
          } else {
            videoElement && videoElement.play()
          }
        }
    
        if (typeof window.document.addEventListener === 'undefined' || typeof document[hidden] === 'undefined') {
          console.log('This demo requires a browser, such as Google Chrome or Firefox, that supports the Page Visibility API.')
        } else {
          // 处理页面可见属性的改变
          window.document.addEventListener(visibilityChange, handleVisibilityChange, false)
    
          // 当视频暂停,设置title
          // This shows the paused
          window.document.addEventListener('pause', function () {
            window.document.title = 'pause'
          }, false)
    
          // 当视频播放,设置title
          window.document.addEventListener('play', function () {
            window.document.title = 'play'
          }, false)
        }
      }
    
      export default useVisibility
    

    其他可预测的使用场景

    • 音视频的播放
    • 页面中的轮询操作,比如常见的打包通过轮询接口实时展示打包报文,切换页面后也还在执行,造成资源浪费
    • 轮播图是否切换
    • 统计页面停留时长、在线时长及浏览量
    • 聊天状态及任务完成的通知

    更多文章

    github查看更多文章

  • 相关阅读:
    导入myeclipse项目出现的问题及解决方案
    sqlserver允许远程连接的配置
    Microsoft SQL Server,附加数据库 错误:Error 916解决方法
    [svc]linux常用手头命令-md版-2017年11月12日 12:31:56
    [elk]es增删改查最佳实战
    [docker]docker日志驱动记录nginx日志情形探究
    [js]面向对象2
    [js]面向对象1
    [js]js中函数传参判断
    [k8s]k8s-ceph-statefulsets-storageclass-nfs 有状态应用布署实践
  • 原文地址:https://www.cnblogs.com/sk-3/p/14030346.html
Copyright © 2011-2022 走看看