Facebook no ads

Makes sponsored feeds invisible on facebook.com

当前为 2020-09-23 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Facebook no ads
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Makes sponsored feeds invisible on facebook.com
// @author       Darmikon
// @match        https://www.facebook.com/*
// @grant        none
// ==/UserScript==

(function() {
    let rootEl = null;

    const throttle = (func, limit) => {
        let inThrottle;
        return function() {
            const args = arguments;
            const context = this;
            if (!inThrottle) {
                func.apply(context, args);
                inThrottle = true;
                setTimeout(() => {
                    inThrottle = false;
                }, limit);
            }
        }
    }

    const doHack = (feed) => {
        // 1. Find this unique block inside the feed
        const spanWithId = feed.querySelector('span[id]');

        if(!spanWithId) return;

        const spanChildren = spanWithId.children;

        // 2. Check if the second child of spanWithId is not a DIV element
        if(spanChildren && spanChildren.length) {
            if(spanChildren[1]) {
                // if(spanChildren[1].nodeName !== 'SPAN'){
                //    console.log(spanChildren[1].nodeName);
                // }
                return spanChildren[1].nodeName !== 'SPAN';
            }
        }
    }

    const findRoot = (cb) => {
        const intervalId = setInterval(() => {
            if(!rootEl) {
                rootEl = document.querySelector('[role="feed"]');
            } else {
                clearInterval(intervalId);
                cb();
            }
        }, 50);
    }

    const trimAds = () => {
        const feeds = [].slice.call(rootEl.children || []).filter(child => {
            return child.hasAttribute('data-pagelet');
        });
        feeds.forEach((feed, i) => {
            try {
                if(doHack(feed)) {
                    // console.log('killed', feed.querySelector('h4 span'));
                    feed.style.display = "none";
                }
            } catch (e) {}
        });
    }

    const runAdsKiller = () => {
        const throttleKill = throttle(trimAds, 50);
        throttleKill();
        window.addEventListener('scroll', throttleKill);
        window.addEventListener('resize', throttleKill);
    }

    const init = () => {
        findRoot(runAdsKiller);
    }

    init();
})();