Pause/Mute HTML5 Audio/Video On Leaving Tab

Pause or mute HTML5 audio/video on leaving a tab and restore them back on returning.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        Pause/Mute HTML5 Audio/Video On Leaving Tab
// @namespace   PauseMuteHTML5AudioVideoAudioOnLeavingTab
// @version     1.0.5
// @license     AGPL v3
// @author      jcunews
// @description Pause or mute HTML5 audio/video on leaving a tab and restore them back on returning.
// @website     https://greatest.deepsurf.us/en/users/85671-jcunews
// @include     *://*/*
// @grant       none
// ==/UserScript==

(() => {

  //=== Configuration Start ===

  var muteInsteadOfPause = false; //set to `true` to mute instead of pause

  //=== Configuration End ===

  var sHidden, sVisibilityChange;

  if ("undefined" !== typeof document.hidden) {
    sHidden = "hidden";
    sVisibilityChange = "visibilitychange";
  } else if ("undefined" !== typeof document.webkitHidden) {
    sHidden = "webkitHidden";
    sVisibilityChange = "webkitvisibilitychange";
  } else if ("undefined" !== typeof document.msHidden) {
    sHidden = "msHidden";
    sVisibilityChange = "msvisibilitychange";
  }

  function checkStatus() {
    if (!document[sHidden]) {
      document.querySelectorAll("audio, video").forEach(function(v) {
        if (!v.off) return;
        if (muteInsteadOfPause) {
          v.muted = false;
        } else if (v.play_) {
          v.play = v.play_;
          delete v.play_;
          v.play();
        } else v.play();
        delete v.off;
      });
    } else {
      document.querySelectorAll("audio, video").forEach(
        function(v) {
          if (muteInsteadOfPause) {
            if (!v.muted) {
              v.off = true;
              setTimeout(() => v.muted = true, 0);
            }
          } else if (!v.paused) {
            v.off = true;
            setTimeout(() => {
              v.play_ = v.play;
              v.play = () => {};
              v.pause();
            }, 0);
          }
        }
      );
    }
  }

  function init() {
    document.removeEventListener(sVisibilityChange, checkStatus);
    document.addEventListener(sVisibilityChange, checkStatus);
  }

  //Support for Structured Page Fragments. For e.g. YouTube
  addEventListener("spfdone", init);

  init();
})();