「沈同学原创」写了个没啥用的脚本 - 隐藏已经过期和已经用完的邀请码

如图所示,这个脚本就是用来隐藏已经过期和已经用完的邀请码的,这样就可以方便邀请码的管理了

使用前
Image description![Image description](https://s.rmimg.com/2025-03-21/1742569329-346922-cleanshot-2025-03-21-at-225943-at-2x.png)
使用后
Image description![Image description](https://s.rmimg.com/2025-03-21/1742569372-329730-2025-03-21-225812.png)

[reply]
```
// ==UserScript==
// @name NodeLoc Hide Code
// @namespace http://tampermonkey.net/
// @version 1.0.4
// @description 隐藏过期和已售罄的商品项
// @author 叫我沈同学
// @match https://www.nodeloc.com/*
// @grant none
// ==/UserScript==

(function () {
‘use strict’;

const hideExpiredItems = () => {
    document.querySelectorAll('li.expired').forEach(li => {
        li.style.display = 'none';
    });

    document.querySelectorAll('li.copyable-item').forEach(li => {
        const pList = li.querySelectorAll('p');
        pList.forEach(p => {
            if (p.textContent.trim() === '剩余可用: 0') {
                li.style.display = 'none';
            }
        });
    });
};

hideExpiredItems();

const observeAjax = () => {
    const send = XMLHttpRequest.prototype.send;
    XMLHttpRequest.prototype.send = function () {
        this.addEventListener('load', () => {
            setTimeout(hideExpiredItems, 500);
        });
        return send.apply(this, arguments);
    };
};

const observeFetch = () => {
    const originalFetch = window.fetch;
    window.fetch = function () {
        return originalFetch.apply(this, arguments).then(response => {
            setTimeout(hideExpiredItems, 500);
            return response;
        });
    };
};

const observer = new MutationObserver((mutations) => {
    let needsUpdate = false;
    mutations.forEach(mutation => {
        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
            needsUpdate = true;
        }
    });
    if (needsUpdate) {
        setTimeout(hideExpiredItems, 500);
    }
});

observer.observe(document.body, {
    childList: true,
    subtree: true,
});

observeAjax();
observeFetch();

let timeoutId;
const debouncedHideExpiredItems = () => {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(hideExpiredItems, 300);
};

window.addEventListener('load', debouncedHideExpiredItems);
window.addEventListener('DOMContentLoaded', debouncedHideExpiredItems);
window.addEventListener('scroll', debouncedHideExpiredItems);

})();
```

[/reply]

好东西

@“‏[已注销]”#p264717 好像有一点点小bug,在异步加载的时候会失效,emmmm让我想想怎么修:xhj01:

@“叫我沈同学”#p264718 好办,你每五秒就刷新一次 DOM。 :xhj29:

@“dfjk”#p264720 OK,明天我改一下

@“叫我沈同学”#p264721 回完看到代码了,</s>addEventListener<e> 只留一个,</s>setTimeout<e> 改成 </s>setInterval<e>,秒数你看着合理就行,就是这么快糙猛 :huaji08:

@“叫我沈同学”#p264716 latest -> 设置 -> UI设置

Image description![Image description](https://s.rmimg.com/2025-03-21/1742571261-499603-image.png)

感谢提供灵感


***

等一下,我没隐藏用完的 :(

@“‏[已注销]”#p264727 这么快

@“叫我沈同学”#p264728 实际上就是加个选项和在处理器加个func的事情

Image description</s>Image description<e>

Image description![Image description](https://s.rmimg.com/2025-03-21/1742571614-527128-image.png)


***

草,刚刚发现 `...[...]` 这最外层是多余的,算了懒得改

牛逼

好东西 感谢分享

更新到1.0.4:修复了异步加载无法隐藏的bug

好东西

感谢沈同学分享

感谢沈同学,支持