Disable web lazy loading images (one-time loading)

Display images directly on the web page, disable lazy loading, load all images at once.

// ==UserScript==
// @name         禁止 Web 延迟加载图片(一次性加载)
// @name:en      Disable web lazy loading images (one-time loading)
// @description  在 Web 页面中直接显示图片,禁止延迟加载,一次性加载所有图片
// @description:en Display images directly on the web page, disable lazy loading, load all images at once.
// @version      0.8.5
// @author       DUN
// @match        *://*/*
// @grant        none
// @run-at       document-start
// @namespace    https://greasyfork.org/users/662094
// ==/UserScript==

(function() {
    'use strict';

    function isExcluded(url) {
        const excludedKeywords = [
            // 在这里添加你要排除的关键词
        ];
        return excludedKeywords.some(keyword => url.includes(keyword));
    }

    function updateImageSource(imgElement) {
        const srcAttribute = imgElement.getAttribute("data-src") || imgElement.getAttribute("data-original") || imgElement.src;
        if (srcAttribute && !isExcluded(srcAttribute)) {
            if (srcAttribute.startsWith('data:image')) {
                imgElement.src = srcAttribute;
            } else {
                imgElement.src = new URL(srcAttribute, window.location.href).href;
            }
        }

        const srcsetAttribute = imgElement.getAttribute("data-srcset");
        if (srcsetAttribute) {
            imgElement.srcset = srcsetAttribute;
        }

        imgElement.removeAttribute('data-src');
        imgElement.removeAttribute('data-srcset');
        imgElement.removeAttribute('srcset');
        imgElement.removeAttribute('sizes');
        imgElement.classList.remove('lazyload', 'lazy');
    }

    function processAddedNodes(addedNodes) {
        addedNodes.forEach(node => {
            if (node.tagName === 'IMG') {
                updateImageSource(node);
            } else if (node.querySelectorAll) {
                node.querySelectorAll('img').forEach(updateImageSource);
            }
        });
    }

    const observer = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
            if (mutation.type === 'childList' && mutation.addedNodes.length) {
                processAddedNodes(mutation.addedNodes);
            } else if (mutation.type === 'attributes' && (mutation.attributeName === 'data-src' || mutation.attributeName === 'data-original')) {
                updateImageSource(mutation.target);
            }
        });
    });

    observer.observe(document.documentElement, {
        childList: true,
        subtree: true,
        attributes: true,
        attributeFilter: ['data-src', 'data-original']
    });

    window.addEventListener('DOMContentLoaded', () => {
        document.querySelectorAll('img').forEach(updateImageSource);
    });
})();