// ==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.1 // @author DUN // @match *://*/* // @grant none // @run-at document-start // @namespace https://greasyfork.org/users/662094 // @downloadURL none // ==/UserScript== (function() { 'use strict'; // 要排除的 URL 关键词列表 const excludedKeywords = [ 'inoreader', 'chrome', 'wp.com', 'github', 'blob', 'gif', 'imgur', 'cdn', 'api', 'data:', 'play', 'ico', '.svg', '.cn', '=' ]; // 检查 URL 是否包含排除的关键词 function isExcluded(url) { return excludedKeywords.some(keyword => url.includes(keyword)); } // 获取绝对 URL 地址 function getAbsoluteImageUrl(relativeOrAbsoluteUrl) { if (relativeOrAbsoluteUrl.startsWith('http') || relativeOrAbsoluteUrl.startsWith('//')) { if (relativeOrAbsoluteUrl.startsWith('//')) { return window.location.protocol + relativeOrAbsoluteUrl; } return relativeOrAbsoluteUrl; } else { const a = document.createElement('a'); a.href = relativeOrAbsoluteUrl; return a.href; } } // 更新图片源地址的函数 function updateImageSource(imgElement) { let srcAttribute = imgElement.getAttribute("data-original") || imgElement.getAttribute("data-src"); if (!srcAttribute) { return; } srcAttribute = getAbsoluteImageUrl(srcAttribute); if (isExcluded(srcAttribute)) { return; } // 移除延迟加载相关的元素或类 const parentElement = imgElement.closest('.img-box'); if (parentElement) { const maskElement = parentElement.querySelector('.n-img-mask'); if (maskElement) { maskElement.remove(); } } // 设置新的图片地址 imgElement.src = srcAttribute; // 移除可能导致加载失败的属性 imgElement.removeAttribute('data-src'); imgElement.removeAttribute('srcset'); imgElement.removeAttribute('sizes'); imgElement.classList.remove('lazyload'); imgElement.classList.remove('lazy'); } // 使用 MutationObserver 来观察 DOM 变化 const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.type === 'attributes' && mutation.attributeName === 'data-src') { updateImageSource(mutation.target); } else if (mutation.type === 'childList' && mutation.addedNodes.length) { mutation.addedNodes.forEach((node) => { if (node.tagName === 'IMG') { updateImageSource(node); } else if (node.querySelectorAll) { node.querySelectorAll('img').forEach(updateImageSource); } }); } }); }); observer.observe(document.documentElement, { childList: true, subtree: true, attributes: true, attributeFilter: ['data-src'] }); window.addEventListener('DOMContentLoaded', () => { document.querySelectorAll('img').forEach(updateImageSource); }); })();