Greasy Fork

Greasy Fork is available in English.

b站自动删除空白视频格

净化b站 AdGuard拦截广告后的空白格子

当前为 2024-11-13 提交的版本,查看 最新版本

// ==UserScript==
// @name         b站自动删除空白视频格
// @namespace    http://greasyfork.icu/zh-CN/scripts
// @version      2024.11.24
// @description  净化b站 AdGuard拦截广告后的空白格子
// @author       cccq
// @match        https://www.bilibili.com/
// @icon         https://ts1.cn.mm.bing.net/th?id=OIP-C.t_km_I0O-asr3a-bNrejjQHaHa&w=204&h=204&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2
// @grant        none
// @license      cccq
// ==/UserScript==

(function() {
    // 观察container是否新增dom
    const container = document.querySelector('.container');

    // 删除元素函数
    function removeHiddenElements() {
        // 查找所有推荐视频卡片
        let allElements = document.querySelectorAll('.bili-video-card.is-rcmd');

        // 筛选出包含隐藏广告的元素
        let adElements = Array.from(allElements).filter(el => {
            // 检查是否存在带有display: none !important样式的wrap元素
            const wrapElement = el.querySelector('.bili-video-card__wrap.__scale-wrap');
            return wrapElement && wrapElement.style.display === 'none';
        });

        // 删除广告元素
        adElements.forEach(el => {
            // 找到广告的父元素
            let biliVideoCard = el.closest('.bili-video-card');
            // 如果广告父元素上还有一层则删除最上层的dom
            if (biliVideoCard) {
                let feedCard = biliVideoCard.closest('.feed-card');
                if (feedCard) {
                    feedCard.remove();
                } else {
                    biliVideoCard.remove();
                }
            }
        });
    }

    // 创建观察器
    const observer = new MutationObserver((mutationsList, observer) => {
        // 当子节点发生变动时
        mutationsList.forEach((mutationRecord) => {
            if (mutationRecord.type === 'childList') {
                mutationRecord.addedNodes.forEach((addedNode) => {
                    if (addedNode.nodeType === Node.ELEMENT_NODE) {
                        // 执行删除元素
                        removeHiddenElements();
                        // 退出foreach循环,等待下次节点新增
                        return;
                    }
                });
            }
        });
    });

    // 配置观察选项
    const config = {
        childList: true,
        subtree: true,
    };

    // 开始观察
    observer.observe(container, config);
})();