欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用JavaScript實現檢測網頁是否為空閑狀態(tài)

 更新時間:2024年03月28日 11:14:40   作者:求知若饑  
最近開發(fā)項目時,常碰到“用戶在一定時間內無任何操作時,跳轉到某個頁面”的需求,所以本文就來使用JavaScript實現這一要求,需要的可以參考下

1. 背景

最近開發(fā)項目時,常碰到“用戶在一定時間內無任何操作時,跳轉到某個頁面”的需求。

網上沖浪后,也沒有找到一個比較好的js封裝去解決這個問題,從而決定自己實現。

2. 如何判斷頁面是否空閑(用戶長時間無操作)

首先,我們要知道什么是空閑?用戶一定時間內,沒有對網頁進行任何操作,則當前網頁為空閑狀態(tài)。

用戶操作網頁,無非就是通過鼠標、鍵盤兩個輸入設備(暫不考慮手柄等設備)。因而我們可以監(jiān)聽相應的輸入事件,來判斷網頁是否空閑(用戶是否操作網頁)。

  • 監(jiān)聽鼠標移動事件mousemove;
  • 監(jiān)聽鍵盤按下事件mousedown;
  • 在用戶進入網頁后,設置延時跳轉,如果觸發(fā)以上事件,則移除延時器,并重新開始。

3. 網頁空閑檢測實現

3.1 簡易實現

以下代碼,簡易實現了一個判斷網頁空閑的方法。

const onIdleDetection = (callback, timeout = 15, immediate = false) => {
  let pageTimer;
  
  const onClearTimer = () => {
    pageTimer && clearTimeout(pageTimer);
    pageTimer = undefined;
  };
  const onStartTimer = () => {
    onClearTimer();
    pageTimer = setTimeout(() => {
      callback();
    }, timeout * 1000);
  };

  const startDetection = () => {
    onStartTimer();
    document.addEventListener('mousedown', onStartTimer);
    document.addEventListener('mousemove', onStartTimer);
  };
  const stopDetection = () => {
    onClearTimer();
    document.removeEventListener('mousedown', onStartTimer);
    document.removeEventListener('mousemove', onStartTimer);
  };
  const restartDetection = () => {
      onClearTimer();
      onStartTimer();
  };

  if (immediate) {
    startDetection();
  }

  return {
    startDetection,
    stopDetection,
    restartDetection
  };
};

也許你注意到了,我并沒有針對onStartTimer事件進行防抖,那這是不是會對性能有影響呢?

是的,肯定有那么點影響,那我為啥不添加防抖呢?

這是因為添加防抖后,形成了setTimeout嵌套,嵌套setTimeout會有精度問題(參考)。

或許你還會說,非活動標簽頁(網頁被隱藏)的setTimeout的執(zhí)行和精度會有問題(參考非活動標簽的超時)。

確實存在以上問題,接下來我們就來一一解決吧!

3.2 處理頻繁觸發(fā)問題

我們可以通過添加一個變量記錄開始執(zhí)行時間,當下一次執(zhí)行與當前的時間間隔小于某個值時直接退出函數,從而解決這個問題(節(jié)流思想應用)。

const onIdleDetection = (callback, timeout = 15, immediate = false) => {
  let pageTimer;
  // 記錄開始時間
  let beginTime = 0;
  const onStartTimer = () => {
    // 觸發(fā)間隔小于100ms時,直接返回
    const currentTime = Date.now();
    if (pageTimer && currentTime - beginTime < 100) {
      return;
    }

    onClearTimer();
    // 更新開始時間
    beginTime = currentTime;
    pageTimer = setTimeout(() => {
      callback();
    }, timeout * 1000);
  };
  const onClearTimer = () => {
    pageTimer && clearTimeout(pageTimer);
    pageTimer = undefined;
  };
  
  const startDetection = () => {
    onStartTimer();
    document.addEventListener('mousedown', onStartTimer);
    document.addEventListener('mousemove', onStartTimer);
  };
  const stopDetection = () => {
    onClearTimer();
    document.removeEventListener('mousedown', onStartTimer);
    document.removeEventListener('mousemove', onStartTimer);
  };
  const restartDetection = () => {
      onClearTimer();
      onStartTimer();
  };
  
  if (immediate) {
    startDetection();
  }

  return {
    startDetection,
    stopDetection,
    restartDetection
  };
};

3.3 處理頁面被隱藏的情況(完整實現)

我們可以監(jiān)聽visibilitychange事件,在頁面隱藏時移除延時器,然后頁面顯示時繼續(xù)計時,從而解決這個問題。

/**
 * 網頁空閑檢測
 * @param {() => void} callback 空閑時執(zhí)行,即一定時長無操作時觸發(fā)
 * @param {number} [timeout=15] 時長,默認15s,單位:秒
 * @param {boolean} [immediate=false] 是否立即開始,默認 false
 * @returns
 */
const onIdleDetection = (callback, timeout = 15, immediate = false) => {
  let pageTimer;
  let beginTime = 0;
  const onClearTimer = () => {
    pageTimer && clearTimeout(pageTimer);
    pageTimer = undefined;
  };
  const onStartTimer = () => {
    const currentTime = Date.now();
    if (pageTimer && currentTime - beginTime < 100) {
      return;
    }

    onClearTimer();
    beginTime = currentTime;
    pageTimer = setTimeout(() => {
      callback();
    }, timeout * 1000);
  };

  const onPageVisibility = () => {
     // 頁面顯示狀態(tài)改變時,移除延時器
     onClearTimer();

     if (document.visibilityState === 'visible') {
       const currentTime = Date.now();
       // 頁面顯示時,計算時間,如果超出限制時間則直接執(zhí)行回調函數
       if (currentTime - beginTime >= timeout * 1000) {
         callback();
         return;
       }
       // 繼續(xù)計時
       pageTimer = setTimeout(() => {
         callback();
       }, timeout * 1000 - (currentTime - beginTime));
     }
  };

  const startDetection = () => {
    onStartTimer();
    document.addEventListener('mousedown', onStartTimer);
    document.addEventListener('mousemove', onStartTimer);
    document.addEventListener('visibilitychange', onPageVisibility);
  };

  const stopDetection = () => {
    onClearTimer();
    document.removeEventListener('mousedown', onStartTimer);
    document.removeEventListener('mousemove', onStartTimer);
    document.removeEventListener('visibilitychange', onPageVisibility);
  };
  
  const restartDetection = () => {
      onClearTimer();
      onStartTimer();
  };

  if (immediate) {
    startDetection();
  }

  return {
    startDetection,
    stopDetection,
    restartDetection
  };
};

通過以上代碼,我們就完整地實現了一個網頁空閑狀態(tài)檢測的方法。

4. 擴展

chrome瀏覽器其實提供了一個Idle DetectionAPI,來實現網頁空閑狀態(tài)的檢測,但是這個API還是一個實驗性特性,并且Firefox與Safari不支持。API參考

到此這篇關于使用JavaScript實現檢測網頁是否為空閑狀態(tài)的文章就介紹到這了,更多相關JavaScript檢測網頁內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JavaScript操作select元素和option的實例代碼

    JavaScript操作select元素和option的實例代碼

    這篇文章主要介紹了JavaScript操作select元素和option的實例代碼的相關資料,需要的朋友可以參考下
    2016-01-01
  • js獲取url中的參數且參數為中文時通過js解碼

    js獲取url中的參數且參數為中文時通過js解碼

    這篇文章主要介紹了url中傳遞中文參數的時候通過js解碼,需要的朋友可以參考下
    2014-03-03
  • JS生成不重復的隨機數組的簡單實例

    JS生成不重復的隨機數組的簡單實例

    下面小編就為大家?guī)硪黄狫S生成不重復的隨機數組的簡單實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • 微信小程序實現animation動畫

    微信小程序實現animation動畫

    這篇文章主要為大家詳細介紹了微信小程序實現animation動畫的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 微信小程序開發(fā)之animation循環(huán)動畫實現的讓云朵飄效果

    微信小程序開發(fā)之animation循環(huán)動畫實現的讓云朵飄效果

    這篇文章主要介紹了微信小程序開發(fā)之animation循環(huán)動畫實現的讓云朵飄效果,結合實例形式分析了animation結合js時間函數實現循環(huán)動畫效果的具體步驟與相關操作技巧,需要的朋友可以參考下
    2017-07-07
  • Echarts?graph關系圖的使用入門級教程

    Echarts?graph關系圖的使用入門級教程

    近期需要使用echarts關系圖,這里給大家總結下,這篇文章主要給大家介紹了關于Echarts?graph關系圖使用的相關資料,文中給出了詳細的代碼介紹,需要的朋友可以參考下
    2024-01-01
  • Javascript HTML5 Canvas實現的一個畫板

    Javascript HTML5 Canvas實現的一個畫板

    這篇文章主要為大家詳細介紹了Javascript HTML5 Canvas實現的一個畫板的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 深入理解JavaScript字節(jié)二進制知識以及相關API

    深入理解JavaScript字節(jié)二進制知識以及相關API

    當前,前端對二進制數據有許多的API可以使用,這豐富了前端對文件數據的處理能力,有了這些能力,就能夠對圖片等文件的數據進行各種處理。本文將著重介紹一些前端二進制數據處理相關的API知識,希望對大家有所幫助
    2023-02-02
  • JavaScript中 this 指向問題深度解析

    JavaScript中 this 指向問題深度解析

    這篇文章主要介紹了JavaScript中 this 指向問題深度解析,JavaScript 中的 this 指向問題有很多文章在解釋,仍然有很多人問,本文給大家深度解析,需要的朋友可以參考下
    2017-02-02
  • JS克隆,屬性,數組,對象,函數實例分析

    JS克隆,屬性,數組,對象,函數實例分析

    這篇文章主要介紹了JS克隆,屬性,數組,對象,函數,結合實例形式分析了javascript中面向對象程序設計相關的對象、屬性、函數及數組等相關技巧,需要的朋友可以參考下
    2016-11-11

最新評論