<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [js] 頁面可見性API 監測用戶切屏

      Page Visibility API

      在做考試系統或者網課系統的時候,通常需要監測用戶是否隱藏了當前標簽頁在看其它頁面。

      Page Visibility API提供了一個事件和兩個狀態來監測頁面可見性,可以用它來判斷用戶是否切屏。

      visibilitychange

      這個事件會在頁面可見性變化時觸發。(隱藏時、打開時)

      // 使用 addEventLisitener
      document.addEventListener('visibilitychange', (e)=>{
          console.log('visibilityState: ', document.visibilityState);
      });
      
      // 或者 onvisibilitychange
      document.onvisibilitychange = function(){
          console.log('visibilityState: ', document.visibilityState);
      }
      

      document.visibilityState

      這個變量有3種值:

      • hidden

        • 瀏覽器被最小化了;
        • 瀏覽器打開,但是當前看的是其它標簽頁;
        • 這個標簽頁要被卸載了(unload);
      • visible

        • 當前正在看標簽頁;

        • 當前瀏覽器處于最小化,但是正在預覽頁面內容;

          如下圖,這種把鼠標移到任務欄圖標上的行為也會觸發 visibilitychange 事件,且 document.visibilityState 變為 visible。

          image-20240830191250009
      • prerender:頁面即將或正在渲染,處于不可見狀態。

      document.hidden

      這個狀態僅用于兼容,平時應使用document.visibilityState。當document.visibilityStatevisible時,document.hiddenfalse,其余情況下都為 true

      iframe

      當頁面中通過 iframe 嵌入子文檔時,iframe節點的display:none;并不會觸發子文檔的 visibilitychange事件。

      子文檔的可見性和父文檔的可見性保持一致。

      示例場景

      考試違規切屏次數統計

      let violationCount = 0;
      const maxViolations = 3; // 設定最大違規次數
      
      document.addEventListener('visibilitychange', function() {
          if (document.visibilityState === 'visible') {
              console.log('考試頁面重新可見');
          } else {
              violationCount++;
              console.log(`考試頁面不可見,違規次數: ${violationCount}`);
      
              // 如果違規次數達到上限,觸發結束考試的邏輯
              if (violationCount >= maxViolations) {
                  endExam();
              } else {
                  alert(`警告:請勿離開考試頁面!您已違規 ${violationCount} 次,最多允許 ${maxViolations} 次違規。`);
              }
          }
      });
      
      function endExam() {
          alert('您已多次離開考試頁面,考試結束!');
          // 在此添加結束考試的邏輯,例如提交答案并退出考試界面
          submitExam();
      }
      
      function submitExam() {
          // 模擬提交考試結果
          console.log('考試結果已提交');
          // 重定向到考試結束頁面或顯示結束信息
          window.location.href = '/exam-finished';
      }
      
      // 模擬考試開始
      console.log('考試開始,請勿離開頁面。');
      
      

      "被動"網課學習

      document.addEventListener('visibilitychange', function() {
          if (document.visibilityState === 'visible') {
              video.play();	// 視頻播放
          } else {
              video.pause();	// 視頻暫停
          }
      });
      

      如何避免逃課?

      下面的策略可以提高逃課的門檻(用戶可能會編寫腳本來讓視頻在頁面不可見的情況下也能播放),但是只能說是防君子不防小人。

      1. setInterval定時檢查visibilityState,缺點是定時器在頁面不可見的情況下執行頻率和設定的時間可能不一樣。

        const videoElement = document.querySelector('video');
        
        function checkVisibility() {
            if (document.visibilityState === 'visible') {
                if (videoElement.paused) {
                    videoElement.play(); // 播放
                }
            } else {
                if (!videoElement.paused) {
                    videoElement.pause(); // 暫停
                }
            }
        }
        
        // 初始檢查頁面可見性并啟動定時器
        checkVisibility();
        setInterval(checkVisibility, 1000); // 每秒檢查一次頁面可見性
        
      2. 監聽視頻元素的play事件,視頻開始播放的時候visibilityState應為visible,否則暫停播放。

        video.addEventListener('play', function() {
            if (document.visibilityState !== 'visible') {
                videoElement.pause();	// 視頻暫停
            }
        });
        
      3. 凍結相關的屬性和方法,避免用戶重寫。

        Object.defineProperty(document, 'visibilityState', {
            configurable: false,
            enumerable: true,
            writable: false,
            value: document.visibilityState
        });
        
        Object.defineProperty(document, 'hidden', {
            configurable: false,
            enumerable: true,
            writable: false,
            value: document.hidden
        });
        
      posted @ 2024-08-30 22:18  feixianxing  閱讀(411)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产成人欧美一区二区三区在线| 亚洲精品无amm毛片| 美女又黄又免费的视频| 国产日韩精品一区二区在线观看播放 | 东京热人妻无码一区二区AV | 婷婷五月综合激情| 国产偷自一区二区三区在线| 波多野无码中文字幕av专区| 精品一区二区三区不卡| 欧美精品在线观看视频| 午夜福利精品国产二区| 久久人人爽人人爽人人片av| 九九热在线免费视频观看| 亚洲大尺度视频在线播放| 亚洲一区av在线观看| 成人看的污污超级黄网站免费| 影音先锋啪啪av资源网站| 财经| 国产成人亚洲日韩欧美| 男人猛躁进女人免费播放| 韩国精品一区二区三区在线观看| 亚洲精品一区二区动漫| ww污污污网站在线看com| 人人做人人澡人人人爽| 色噜噜在线视频免费观看| 久久亚洲熟女cc98cm| 97久久精品午夜一区二区| 久久久WWW成人免费精品| 99精品国产综合久久久久五月天 | 免费无码又爽又刺激高潮虎虎视频 | 亚洲精品免费一二三区| 亚洲国产超清无码专区| аⅴ天堂中文在线网| 亚洲欧美中文字幕日韩一区二区 | 插入中文字幕在线一区二区三区| 一区二区三区鲁丝不卡| 97人人超碰国产精品最新| 成人无码一区二区三区网站| 国产在线精品国偷产拍| www亚洲精品| 肉大捧一进一出免费视频|