Speed Up Web Page Loading

Make web pages load faster by blocking ads and implementing lazy loading for images.

目前為 2024-07-08 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name Speed Up Web Page Loading
  3. // @namespace https://discord.gg/gFNAH7WNZj
  4. // @version 1.3
  5. // @description Make web pages load faster by blocking ads and implementing lazy loading for images.
  6. // @author Bacon But Pro
  7. // @match *://*/*
  8. // @grant none
  9. // @icon https://cdn141.picsart.com/351217840073211.png
  10. // @license MIT
  11. // ==/UserScript==
  12. (function() {
  13. 'use strict';
  14. // Block ads and tracking scripts
  15. const blockedDomains = [
  16. 'doubleclick.net',
  17. 'googlesyndication.com',
  18. 'google-analytics.com',
  19. 'adsafeprotected.com',
  20. 'adnxs.com',
  21. 'rubiconproject.com',
  22. 'pubmatic.com',
  23. 'scorecardresearch.com',
  24. 'bluekai.com',
  25. 'facebook.net',
  26. 'amazon-adsystem.com',
  27. 'ads-twitter.com',
  28. 'criteo.com',
  29. 'taboola.com',
  30. 'outbrain.com',
  31. 'cdn.ampproject.org',
  32. 'quantserve.com',
  33. 'googletagmanager.com',
  34. 'gemini.yahoo.com'
  35. ];
  36. const observer = new MutationObserver(() => {
  37. document.querySelectorAll('script[src], iframe[src]').forEach(el => {
  38. blockedDomains.forEach(domain => {
  39. if (el.src.includes(domain)) {
  40. el.remove();
  41. }
  42. });
  43. });
  44. });
  45. observer.observe(document.documentElement, { childList: true, subtree: true });
  46. // Implement lazy loading for images
  47. document.addEventListener('DOMContentLoaded', () => {
  48. const images = document.querySelectorAll('img');
  49. images.forEach(image => {
  50. if (image.complete) return;
  51. image.setAttribute('loading', 'lazy');
  52. });
  53. const lazyLoadObserver = new IntersectionObserver((entries, observer) => {
  54. entries.forEach(entry => {
  55. if (entry.isIntersecting) {
  56. const img = entry.target;
  57. img.src = img.dataset.src;
  58. observer.unobserve(img);
  59. }
  60. });
  61. });
  62. images.forEach(img => {
  63. if (img.dataset.src) {
  64. lazyLoadObserver.observe(img);
  65. } else {
  66. img.dataset.src = img.src;
  67. img.src = '';
  68. lazyLoadObserver.observe(img);
  69. }
  70. });
  71. });
  72.  
  73. // Remove unwanted elements like pop-ups
  74. const removeUnwantedElements = () => {
  75. const unwantedSelectors = [
  76. '.popup', // common class name for pop-ups
  77. '.ad-banner', // common class name for ad banners
  78. '#subscribe-modal', // common ID for subscription modals
  79. '.overlay', // common class name for overlay ads
  80. ];
  81.  
  82. unwantedSelectors.forEach(selector => {
  83. document.querySelectorAll(selector).forEach(el => el.remove());
  84. });
  85. };
  86.  
  87. const unwantedObserver = new MutationObserver(removeUnwantedElements);
  88. unwantedObserver.observe(document.documentElement, { childList: true, subtree: true });
  89. document.addEventListener('DOMContentLoaded', removeUnwantedElements);
  90.  
  91. // Keep essential buttons
  92. const keepEssentialButtons = () => {
  93. const essentialButtons = [
  94. 'button.important', // Add selectors for buttons you want to keep
  95. '.keep-this-button',
  96. ];
  97.  
  98. essentialButtons.forEach(selector => {
  99. document.querySelectorAll(selector).forEach(el => {
  100. el.style.display = 'block';
  101. });
  102. });
  103. };
  104.  
  105. const essentialButtonsObserver = new MutationObserver(keepEssentialButtons);
  106. essentialButtonsObserver.observe(document.documentElement, { childList: true, subtree: true });
  107. document.addEventListener('DOMContentLoaded', keepEssentialButtons);
  108. })();