切页的时候,视频播放会暂停
方案 B:禁止页面调用 pause()
你还可以粗暴 hook 掉视频的 pause()
方法:
HTMLMediaElement.prototype.pause = function() {
console.log("pause() 被拦截");
};
这样页面调用 video.pause()
就不会生效(不过要小心,有些网课用暂停来分节播放,可能导致进度出问题)。
进阶版本
// 保存原始 pause 方法
const originalPause = HTMLMediaElement.prototype.pause;
// 页面是否激活
let isPageActive = true;
function updatePageState() {
isPageActive = (document.visibilityState === "visible") && document.hasFocus();
console.log("页面状态:", isPageActive ? "激活" : "未激活");
}
document.addEventListener("visibilitychange", updatePageState);
window.addEventListener("focus", updatePageState);
window.addEventListener("blur", updatePageState);
updatePageState(); // 初始化一次
// 拦截 pause 调用
HTMLMediaElement.prototype.pause = function(...args) {
if (isPageActive) {
console.log("允许暂停");
return originalPause.apply(this, args);
} else {
console.log("拦截 pause() 调用 -> 不允许暂停");
// 不调用原始 pause,保持播放
return;
}
};
// 兜底:监听 pause 事件,后台时强制恢复播放
document.addEventListener("pause", function(e) {
if (e.target instanceof HTMLMediaElement) {
if (!isPageActive) {
console.log("检测到视频被暂停(强制/系统触发),立即恢复播放");
e.target.play().catch(err => {
console.warn("恢复播放失败:", err);
});
}
}
}, true); // 捕获阶段,优先执行
油猴脚本
// ==UserScript==
// @name 防止 LearnIn 视频后台暂停
// @namespace http://tampermonkey.net/
// @version 0.1
// @description 阻止 LearnIn 网课视频在切换标签/后台时被暂停
// @author 你
// @match https://www.*.cn/*
// @run-at document-start
// @grant none
// ==/UserScript==
(function() {
'use strict';
// 保存原始 pause 方法
const originalPause = HTMLMediaElement.prototype.pause;
// 页面是否激活
let isPageActive = true;
function updatePageState() {
isPageActive = (document.visibilityState === "visible") && document.hasFocus();
console.log("页面状态:", isPageActive ? "激活" : "未激活");
}
document.addEventListener("visibilitychange", updatePageState);
window.addEventListener("focus", updatePageState);
window.addEventListener("blur", updatePageState);
updatePageState(); // 初始化一次
// 拦截 pause 调用
HTMLMediaElement.prototype.pause = function(...args) {
if (isPageActive) {
console.log("允许暂停");
return originalPause.apply(this, args);
} else {
console.log("拦截 pause() 调用 -> 不允许暂停");
return; // 不调用原始 pause
}
};
// 兜底:监听 pause 事件,后台时强制恢复播放
document.addEventListener("pause", function(e) {
if (e.target instanceof HTMLMediaElement) {
if (!isPageActive) {
console.log("检测到视频被暂停(强制/系统触发),立即恢复播放");
e.target.play().catch(err => {
console.warn("恢复播放失败:", err);
});
}
}
}, true);
})();
鼠标出了视频播放
// 获取 window 上所有事件监听器(Chrome)
const allEvents = getEventListeners(window);
// 如果存在 mouseout 或 mouseleave,删除它们
["mouseout", "mouseleave"].forEach(evt => {
if(allEvents[evt]){
allEvents[evt].forEach(listener => {
window.removeEventListener(evt, listener.listener, listener.useCapture);
console.log(`已删除 window 上的 ${evt} 事件监听器`);
});
}
});
// 同时删除 document 上可能绑定的事件
const docEvents = getEventListeners(document);
["mouseout", "mouseleave"].forEach(evt => {
if(docEvents[evt]){
docEvents[evt].forEach(listener => {
document.removeEventListener(evt, listener.listener, listener.useCapture);
console.log(`已删除 document 上的 ${evt} 事件监听器`);
});
}
});