← 全部文章

教程

为每个视频强制使用原生控件

自定义视频播放器看起来很时髦,直到它们坏掉:缺少进度条、没有音量滑块、一个无视点击的播放按钮。浏览器免费附带一个可靠的控制栏。一条 JustZix 规则把它强制到每个视频上,让你总是有可用的控件。

唯一重要的那个属性

每个 <video> 元素都有一个布尔型 controls 属性。当它为 true 时,浏览器绘制它自己的控制栏。网站禁用它,好让它们的自定义 UI 接管。把它重新打开:

document.querySelectorAll('video').forEach(function (v) {
  v.controls = true;
});

这就是核心。下面的配方让它在动态页面上保持,并阻止网站再次移除它。

在动态播放器上保持控件

许多网站在页面加载后把 controls 关掉,或者整个替换视频元素。一个同时监视新节点和属性变化的 MutationObserver 让你的设置保持就位。

(function () {
  function force(v) {
    if (v.controls !== true) { v.controls = true; }
  }
  function scan(root) {
    if (root.tagName === 'VIDEO') { force(root); }
    if (root.querySelectorAll) {
      root.querySelectorAll('video').forEach(force);
    }
  }
  scan(document.documentElement);
  new MutationObserver(function (records) {
    records.forEach(function (rec) {
      if (rec.type === 'attributes' && rec.target.tagName === 'VIDEO') {
        force(rec.target);
      }
      rec.addedNodes.forEach(function (n) {
        if (n.nodeType === 1) { scan(n); }
      });
    });
  }).observe(document.documentElement, {
    childList: true,
    subtree: true,
    attributes: true,
    attributeFilter: ['controls']
  });
})();

attributeFilter 把观察器收窄到仅 controls 属性,所以即便在繁忙的页面上它也保持低开销。

用 CSS 隐藏损坏的自定义 UI

一旦原生栏可见,网站的自定义遮罩常常坐在它上面并偷走点击。一条小的 CSS 规则可以把它推开。自定义控件通常带有可预测的类或数据属性;检查页面一次并定位它。

.video-player .custom-controls,
[data-player-ui],
.vjs-control-bar {
  display: none !important;
}

video {
  pointer-events: auto !important;
}

第二个块重新启用视频本身的点击,以防网站禁用了它们好让其遮罩捕获每一次交互。调整选择器以匹配你正在处理的播放器。

一个组合的点击修复动作

如果你只是偶尔想要原生控件,就把它绑定到一个按键上,而不是总是运行。这条规则在你按下一个快捷键时恢复控件并清除阻塞的遮罩。

document.addEventListener('keydown', function (e) {
  if (e.altKey && e.key.toLowerCase() === 'c') {
    document.querySelectorAll('video').forEach(function (v) {
      v.controls = true;
      v.style.pointerEvents = 'auto';
      v.style.zIndex = '2147483647';
      v.style.position = 'relative';
    });
  }
}, true);

抬高 z-index 把视频抬到任何遮罩之上,这样它自己的控制栏就能接收点击。

实用提示

在我们的现成示例里找到一个打包好的版本,或者下载 JustZix。要在速度上更进一步,请阅读在任何网站上控制视频播放速度

为这篇文章评分

暂无评分 — 成为第一个。

自己动手试试

安装 JustZix,粘贴本文中的任意代码片段。两分钟,从零到一条在你所有设备上生效的规则。

获取 JustZix

功能 · 工作原理 · 示例 · 应用场景