切页的时候,视频播放会暂停

方案 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} 事件监听器`);
        });
    }
});

posted @ 2025-09-04 13:19  ChuckLu  阅读(34)  评论(0)    收藏  举报