Show Server Errors with Time / by leizingyiu with gpt

Display a floating layer for server errors with time and animations, and fix unnecessary alerts.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Show Server Errors with Time / by leizingyiu with gpt
// @namespace    http://leizingyiu.net/
// @version      1.1
// @description  Display a floating layer for server errors with time and animations, and fix unnecessary alerts.
// @author       leizingyiu & GPT
// @license      MIT
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    // 创建浮层容器
    const errorContainer = document.createElement('div');
    errorContainer.style.position = 'fixed';
    errorContainer.style.bottom = '0';
    errorContainer.style.left = '0';
    errorContainer.style.width = '100%';
    errorContainer.style.maxHeight = '30vh'; // 限制显示高度
    errorContainer.style.overflowY = 'auto';
    errorContainer.style.pointerEvents = 'none'; // 默认不干扰页面操作
    errorContainer.style.zIndex = '9999';
    errorContainer.style.display = 'flex';
    errorContainer.style.flexDirection = 'column';
    errorContainer.style.alignItems = 'center';
    errorContainer.style.gap = '5px';
    document.body.appendChild(errorContainer);

    // 记录当前错误数
    const MAX_ERRORS = 10;
    let errorCount = 0;

    // 创建错误显示元素
    function createErrorElement(message, time) {
        const errorElement = document.createElement('div');
        errorElement.innerHTML = `<strong>${time}</strong>: ${message}`;
        errorElement.style.background = 'rgba(255, 69, 58, 0.9)'; // 错误背景色
        errorElement.style.color = 'white';
        errorElement.style.padding = '10px 20px';
        errorElement.style.borderRadius = '5px';
        errorElement.style.boxShadow = '0 2px 5px rgba(0, 0, 0, 0.3)';
        errorElement.style.opacity = '0';
        errorElement.style.transform = 'translateY(100%)';
        errorElement.style.transition = 'opacity 0.5s ease, transform 0.5s ease';
        errorElement.style.pointerEvents = 'auto'; // 鼠标可交互
        errorElement.style.cursor = 'default';

        // 鼠标悬停暂停倒计时
        let hideTimeout;
        errorElement.addEventListener('mouseover', () => {
            clearTimeout(hideTimeout);
        });
        errorElement.addEventListener('mouseout', () => {
            hideTimeout = setTimeout(() => {
                hideErrorElement(errorElement);
            }, 3000);
        });

        // 动画显示
        setTimeout(() => {
            errorElement.style.opacity = '1';
            errorElement.style.transform = 'translateY(0)';
        }, 10);

        // 自动消失
        hideTimeout = setTimeout(() => {
            hideErrorElement(errorElement);
        }, 3000);

        return errorElement;
    }

    // 隐藏错误元素
    function hideErrorElement(errorElement) {
        errorElement.style.opacity = '0';
        errorElement.style.transform = 'translateY(100%)';
        setTimeout(() => {
            errorElement.remove();
            errorCount--;
        }, 500);
    }

    // 显示错误
    function showError(message) {
        const currentTime = new Date().toLocaleTimeString(); // 错误时间
        if (errorCount >= MAX_ERRORS) {
            // 移除最旧的错误
            errorContainer.firstChild?.remove();
            errorCount--;
        }
        const errorElement = createErrorElement(message, currentTime);
        errorContainer.appendChild(errorElement);
        errorCount++;
    }

    // 拦截 fetch
    const originalFetch = window.fetch;
    window.fetch = async function (...args) {
        try {
            const response = await originalFetch(...args);
            if (!response.ok && response.status === 413) {
                showError(`Error ${response.status}: ${response.statusText}`);
            }
            return response;
        } catch (error) {
            showError(`Network Error: ${error.message}`);
            throw error;
        }
    };

    // 拦截 XMLHttpRequest
    const originalXhrOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function (...args) {
        this.addEventListener('load', function () {
            if (this.status === 413) {
                showError(`Error ${this.status}: ${this.statusText}`);
            }
        });
        originalXhrOpen.apply(this, args);
    };
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址