Auto Close Popups for Learning Site & Block Mouse Leave Popup Improved
// ==UserScript==
// @name Remove mouse restrictions and automatically close pop-up windows in moxueyuan
// @namespace https://mbt.jd.com/cards/ffksimple/home.html?channelName=wdqb_sy_icon&do_not_click_on_me
// @namespace https://t.me/mycutcbot
// @version 0.22
// @description Auto Close Popups for Learning Site & Block Mouse Leave Popup Improved
// @author ziqs
// @match *://*.study.moxueyuan.com/*
// @grant none
// @license GPL-3.0-or-later
// ==/UserScript==
(function() {
'use strict';
// 定義一個阻止事件的函數
function preventEvent(e) {
e.stopImmediatePropagation();
e.preventDefault();
}
// 監聽 `mouseleave`, `mouseout`, 和 `blur` 事件
['mouseleave', 'mouseout', 'blur'].forEach(eventType => {
window.addEventListener(eventType, preventEvent, true);
document.addEventListener(eventType, preventEvent, true);
});
// 定時移除動態新增的事件監聽器
const observer = new MutationObserver(() => {
document.querySelectorAll('*').forEach(element => {
try {
element.onmouseleave = null;
element.onmouseout = null;
element.onblur = null;
} catch (error) {
console.error(`Error clearing event listeners on ${element}`, error);
}
});
});
// 開始監聽 DOM 變化
observer.observe(document.body, { childList: true, subtree: true });
})();
(function() {
'use strict';
// 監聽 <body> 的類別名稱變化
const observer = new MutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
const bodyClass = document.body.className;
// 檢查是否包含 el-popup-parent--hidden 類
if (bodyClass.includes('el-popup-parent--hidden')) {
console.log('Popup detected, attempting to click "I am here" button after delay');
// 延遲 5 秒點擊按鈕
setTimeout(() => {
// 尋找所有符合條件的按鈕
const buttons = document.querySelectorAll('.dialog-footer-cancel');
for (const button of buttons) {
if (button.textContent.includes('我在')) {
button.click();
console.log('"I am here" button clicked after 5 seconds');
break;
}
}
}, 5000); // 5秒延遲(5000毫秒)
}
}
}
});
// 開始監聽 <body> 的屬性變化
observer.observe(document.body, { attributes: true });
})();