问题背景在论坛发帖或回帖时,每次都会触发积分奖励弹窗,但是弹窗消失速度很快
有时候运气好,触发了大额的奖励,这时想要截图留念,往往已经错过时机了
原理分析浏览器控制台调试观察后,发现论坛前端移除弹窗采用了“先隐藏、后销毁”的方法: 解决方案既然明确了销毁机制,我们可以通过重写 removeChild 方法来进行拦截: - 拦截判断:改写原生的 removeChild 逻辑,满足id为ntcwin、文字包含“发表”条件,执行脚本内的代码而不是移除元素
- 强制显示:将已被 CSS 隐藏的弹窗重新修改为可见状态,方便截图
- 手动释放:为了截图后可以销毁,为弹窗绑定 onclick 事件,手动点击弹窗后,会触发原有的销毁逻辑将其彻底移除
(由于日常回帖量较少,本方案只为了个人使用,提供一种简单的拦截机制,而不引入记账等复杂操作)
(可能会跟记账本冲突)
效果
相比原本的弹窗样式加了黄色的边框 ,要完全跟原本的弹窗一致,删除代码中的这行 child.style.border = '2px solid rgba(255,247,174,1)'; // 边框表示锁定成功
@Name @Name @Match @Name @Match
- // ==UserScript==
- // @Name Discuz 积分弹窗拦截
- // @namespace http://tampermonkey.net/
- // @version 1.1
- // @description 拦截积分弹窗
- // @author Me
- // @match https://*.gamemale.com/forum.php*
- // @match https://*.gamemale.com/thread-*
- // @match https://*.gamemale.com/*mod=viewthread*
- // @grant GM_setValue
- // @grant GM_getValue
- // @grant GM_xmlhttpRequest
- // @run-at document-start
- // ==/UserScript==
- (function () {
- 'use strict';
- (() => {
- // 拦截 DOM 移除:阻止 ntcwin 节点删除 ---
- const originalRemoveChild = Element.prototype.removeChild;
- Element.prototype.removeChild = function (child) {
- if (child && child.id === 'ntcwin' && child.textContent.includes("发表")) {
- console.log("%c[锁定] 阻止移除积分弹窗", "background:#222; color:#bada55; padding:2px;");
- // 样式固化:移除时候强制显示
- child.style.setProperty('display', 'block', 'important');
- child.style.setProperty('visibility', 'visible', 'important');
- child.style.setProperty('opacity', '1', 'important');
- child.style.border = '2px solid rgba(255,247,174,1)'; // 边框表示锁定成功
- // 允许手动点击关闭
- child.onclick = function () { originalRemoveChild.call(document.getElementById('append_parent') || child.parentNode, child); };
- return child;
- }
- return originalRemoveChild.apply(this, arguments);
- };
- })();
- })();
复制代码
|