Facebook Hide Ads (a.k.a. sponsored posts)

Removes ads (a.k.a. sponsored posts) from feed and sidebar

目前为 2020-07-23 提交的版本。查看 最新版本

// ==UserScript==
// @name         Facebook Hide Ads (a.k.a. sponsored posts)
// @namespace    https://openuserjs.org/users/burn
// @version      0.4
// @description  Removes ads (a.k.a. sponsored posts) from feed and sidebar
// @author       burn
// @copyright    2020, burn (https://openuserjs.org/users/burn)
// @license      MIT
// @match        https://www.facebook.com/*
// @grant        none
// @run-at       document-idle
// ==/UserScript==

(function() {
    'use strict';
    let qS = function (el, scope) {
      scope = (typeof scope == 'object') ? scope : document;
      return scope.querySelector(el) || false;
    },
    qSall = function (els, scope) {
      scope = (typeof scope == 'object') ? scope : document;
      return scope.querySelectorAll(els) || false;
    },
    targetNode = qS('body'),
    observerConfig = {
      attributes: false,
      childList: true,
      subtree: true
    },
    getParentEl = function(elmChild) {
        return elmChild.closest('[data-pagelet^="FeedUnit_"]') || false;
    },
    isFound = false,
    removeAdsInFeed = function(ads) {
        Array.prototype.forEach.call(ads, function(el) {
            let wrapper = getParentEl(el);
            if (wrapper !== false) {
                //console.log("Found wrapper for " + el);
                if (wrapper.parentNode != null)
                    wrapper.parentNode.removeChild(wrapper);
                else {
                    const evt = new Event('mouseenter');
                    //console.log("dispatcho evento");
                    wrapper.dispatchEvent(evt);
                }
            } /*else {
                console.log("Can not find parent element");
            }*/
        });
    },
    removeAbsoluteSpans = function(elm) {
        Array.prototype.forEach.call(qSall('span[style="position: absolute; top: 3em;"]', elm), function(el) {
            el.parentNode.removeChild(el);
        });
    },
    callback = function (mutationsList, observer) {
      mutationsList.forEach(function (mutation) {
        var entry = {
          mutation: mutation,
          el: mutation.target,
          value: mutation.target.textContent,
          oldValue: mutation.oldValue
        };

        removeAbsoluteSpans(entry.el);

        // ads in right sidebar, old fb design
        let ego_wrapper = qS('#pagelet_ego_pane', entry.el);
        if (ego_wrapper) ego_wrapper.parentNode.removeChild(ego_wrapper);

        /* new fb 2020 design */
        if (entry.value.indexOf("Sponsored") >= 0) {
            //console.log("sponsored found for " + entry.el);
            removeAdsInFeed([entry.el]);
        }
      });
    };

    removeAbsoluteSpans(qS('body'));
    // ads in right sidebar, old fb design
    let ego_wrapper = qS('#pagelet_ego_pane');
    if (ego_wrapper) ego_wrapper.parentNode.removeChild(ego_wrapper);

    var observer = new MutationObserver(callback);
    observer.observe(targetNode, observerConfig);
})();