您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
One click to close any overlay on any website
- // ==UserScript==
- // @name Behind The Overlay
- // @namespace Behind The Overlay
- // @description One click to close any overlay on any website
- // @author NicolaeNMV + daijro
- // @version 2.0
- // @include *://*
- // @icon https://addons.cdn.mozilla.net/user-media/addon_icons/521/521928-32.png
- // @grant GM_registerMenuCommand
- // ==/UserScript==
- /**
- * This is a script that will remove overlay popups in the 99% of the cases.
- * It's doing that by detecting DOM elements.
- *
- * Originally from here: https://github.com/NicolaeNMV/BehindTheOverlay
- * Modified by daijro to work as a userscript
- **/
- var debug = false;
- var utils = (function () {
- function hideElement(element) {
- styleImportant(element, 'display', 'none');
- }
- function styleImportant(element, cssProperty, cssValue) {
- element.style[cssProperty] = '';
- var cssText = element.style.cssText || '';
- if (cssText.length > 0 && cssText.slice(-1) != ';')
- cssText += ';';
- // Some pages are using !important on elements, so we must use it too
- element.style.cssText = cssText + cssProperty + ': ' + cssValue + ' !important;';
- }
- function isVisible(element) {
- return element.offsetWidth > 0 && element.offsetHeight > 0;
- }
- function getZIndex(element) {
- return parseInt(window.getComputedStyle(element).zIndex);
- }
- function isAnElement(node) {
- return node.nodeType == 1; // nodeType 1 mean element
- }
- function nodeListToArray(nodeList) {
- return Array.prototype.slice.call(nodeList);
- }
- function forEachElement(nodeList, functionToApply) {
- nodeListToArray(nodeList).filter(isAnElement).forEach(function (element) {
- functionToApply.call(this, element);
- });
- }
- function collectParrents(element, predicate) {
- var matchedElement = element && predicate(element) ? [element] : [];
- var parent = element.parentNode;
- if (parent && parent != document && parent != document.body) {
- return matchedElement.concat(collectParrents(parent, predicate));
- } else {
- return matchedElement;
- }
- }
- // Calculate the number of DOM elements inside an element
- function elementWeight(element, maxThreshold) {
- var grandTotal = 0;
- var nextElement = element;
- var nextGrandChildNodes = [];
- function calculateBreathFirst(element) {
- var total = 0;
- var nextChildElements = [];
- var childNodes = element.childNodes;
- total = childNodes.length;
- forEachElement(childNodes, function (childNode) {
- var grandChildNodes = nodeListToArray(childNode.childNodes);
- total += grandChildNodes.length;
- nextChildElements = nextChildElements.concat(grandChildNodes.filter(isAnElement));
- });
- return [total, nextChildElements];
- }
- while (nextElement) {
- var tuple_total_nextChildElements = calculateBreathFirst(nextElement);
- var total = tuple_total_nextChildElements[0];
- grandTotal += total;
- nextGrandChildNodes = nextGrandChildNodes.concat(tuple_total_nextChildElements[1]);
- if (grandTotal >= maxThreshold) {
- break;
- } else {
- nextElement = nextGrandChildNodes.pop();
- }
- }
- return grandTotal;
- }
- return {
- hideElement: hideElement,
- isVisible: isVisible,
- getZIndex: getZIndex,
- forEachElement: forEachElement,
- collectParrents: collectParrents,
- elementWeight: elementWeight,
- styleImportant: styleImportant
- }
- })();
- var overlayRemover = function (debug, utils) {
- function hideElementsAtZIndexNear(nearElement, thresholdZIndex) {
- var parent = nearElement.parentNode;
- // The case when nearElement is a document
- if (parent === null) {
- return;
- }
- var children = parent.childNodes;
- utils.forEachElement(children, function (child) {
- if (utils.getZIndex(child) >= thresholdZIndex) {
- utils.hideElement(child);
- }
- })
- }
- // Check the element in the middle of the screen
- // Search fo elements that have zIndex attribute
- function methodTwoHideElementMiddle() {
- var overlayPopup = document.elementFromPoint(window.innerWidth / 2, window.innerHeight / 2);
- var overlayFound = utils.collectParrents(overlayPopup, function (el) {
- return utils.getZIndex(el) > 0;
- });
- if (debug)
- console.debug('Overlay found: ', overlayFound);
- if (overlayFound.length == 0)
- return false;
- var olderParent = overlayFound.pop();
- if (debug)
- console.debug('Hide parrent: ', olderParent);
- return olderParent;
- }
- function disableBlur() {
- var someContainerMaybe = document.elementFromPoint(window.innerWidth / 2, window.innerHeight / 2);
- var bluredParentsFound = utils.collectParrents(someContainerMaybe, function (el) {
- return window.getComputedStyle(el).filter.includes('blur');
- });
- if (bluredParentsFound.length == 0)
- return false;
- var topParent = bluredParentsFound.pop();
- // Some element can act as a container, that can be blured or masking the whole content
- var isContainerOccupyingAboutSpaceAsBody = topParent.offsetWidth >= (document.body.offsetWidth - 100);
- if (isContainerOccupyingAboutSpaceAsBody) {
- utils.styleImportant(topParent, 'filter', 'blur(0)');
- if (debug) console.log('Blur removed!', topParent);
- return true;
- }
- return false;
- }
- function containersOverflowAuto() {
- var containers = [document.documentElement, document.body];
- containers.forEach(function (element) {
- if (window.getComputedStyle(element).overflowY == 'hidden') {
- utils.styleImportant(element, 'overflow', 'auto');
- }
- if (window.getComputedStyle(element).position == 'fixed') {
- utils.styleImportant(element, 'position', 'static');
- }
- })
- }
- function run() {
- for (var i = 0; i < 10; i++) {
- var candidate = methodTwoHideElementMiddle();
- var first = i == 0;
- if (candidate === false) {
- if (first)
- alert('No overlay has been found on this website.');
- break;
- } else {
- if (!first) {
- // Prevent to hide the actual content
- var weightThreshold = 100;
- var candidateWeight = utils.elementWeight(candidate, weightThreshold)
- if (candidateWeight < weightThreshold) {
- if (debug)
- console.log('Element is too lightweight, hide it', candidate);
- utils.hideElement(candidate);
- } else {
- if (debug)
- console.log("Element is too heavy, don't hide it", candidate);
- }
- } else {
- utils.hideElement(candidate);
- containersOverflowAuto();
- disableBlur();
- }
- }
- }
- }
- return {
- run: run
- };
- };
- function enableCommandMenu() {
- var commandMenu = true;
- try {
- if (typeof(GM_registerMenuCommand) == undefined) {
- return;
- } else {
- if (commandMenu == true ) {
- GM_registerMenuCommand('Remove overlay', function() {
- overlayRemoverRun();
- });
- }
- }
- }
- catch(err) {
- console.log(err);
- }
- }
- overlayRemoverInstance = overlayRemover(debug, utils);
- function overlayRemoverRun() {
- overlayRemoverInstance.run();
- }
- function keyPress(event) {
- if (event.ctrlKey && event.shiftKey && event.keyCode == 88) {
- overlayRemoverRun();
- }
- }
- enableCommandMenu();
- document.addEventListener('keydown', keyPress);