屏蔽minecraft.net官网的网易弹窗

屏蔽minecraft.net官网的网易弹窗,支持旧版和新版的弹窗

// ==UserScript==
// @name         屏蔽minecraft.net官网的网易弹窗
// @namespace    http://tampermonkey.net/
// @version      0.3.1
// @description  屏蔽minecraft.net官网的网易弹窗,支持旧版和新版的弹窗
// @author       kzyqq00-Player
// @match        https://www.minecraft.net/*
// @license      MIT
// @icon         https://www.minecraft.net/etc.clientlibs/minecraftnet/clientlibs/clientlib-site/resources/favicon-96x96.png
// @grant        none
// @run-at       document-body
// ==/UserScript==

(function () {
    'use strict';

    const BUTTON_ELEMENT_SELECTOR_TEXT = 'div.MC_modal_actions_container.MC_modalA_contentPanel_actions.MC_modal_actions_singlerow > button:nth-child(2)';
    const LEGACY_DIALOG_ELEMENT_SELECTOR_TEXT = '.netease-promotion-popup';

    const buttonElement = document.querySelector(BUTTON_ELEMENT_SELECTOR_TEXT); // 先尝试使用新版按钮
    if (!buttonElement) {
        const legacyDialog = document.querySelector(LEGACY_DIALOG_ELEMENT_SELECTOR_TEXT);
        if (!legacyDialog) { // 如果找不到旧版弹窗,就监测页面变动,一旦监测到了新版按钮出现就点击/旧版弹窗出现就移除
            new Promise((resolve, reject) => {
                const observer = new MutationObserver(() => {
                    const _button = document.querySelector(BUTTON_ELEMENT_SELECTOR_TEXT);
                    const _legacyDialog = document.querySelector(LEGACY_DIALOG_ELEMENT_SELECTOR_TEXT);
                    if (_button || _legacyDialog) { // 如果新版或旧版按钮任意一个存在,则resolve
                        clearTimeout(id);
                        resolve([_button || _legacyDialog, Boolean(_button)]);
                        observer.disconnect();
                    }
                });

                const config = {
                    childList: true,
                    subtree: true
                };
                try {
                    observer.observe(document.querySelector('div.xfpage.page.basicpage'), config); // 尝试监听范围更小的元素;如果没有,则监听body
                } catch (_) {
                    observer.observe(document.body, config);
                }

                const id = setTimeout(() => {
                    observer.disconnect();
                    reject(); // 超时就reject
                }, 1000); // 超时1秒
            })
                .then((res) => {
                    if (res[1]) { // 新版按钮
                        res[0].click(); // 把resolve过来的按钮元素点击
                    } else { // 旧版弹窗
                        document.body.classList.remove('modal-open');

                        res[0].remove();
                    }
                })
                .catch(() => {
                    alert('尝试获取按钮/弹窗失败,可能是因为油猴脚本版本过旧,请尝试更新到最新版本;如果已经是最新版本,请反馈给作者,不需要有其他的描述,给这个弹窗的截图就好');
                    throw new TypeError('Get button element failed');
                });
        } else { // 如果直接找到了旧版弹窗就直接移除
            legacyDialog.remove();
        }
    } else {
        buttonElement.click();
    }
})();