getOutMyWay

把礙眼的東西掃掉,允許使用者自己新增元素選擇器(推薦搭配調整頁面顯示的腳本)

  1. // ==UserScript==
  2. // @name getOutMyWay
  3. // @name:en Get Out My Way
  4. // @name:ja 邪魔なものを取り除く
  5. // @name:ko 거슬리는 것들을 없애기
  6. // @name:de Aus dem Weg räumen
  7. // @description 把礙眼的東西掃掉,允許使用者自己新增元素選擇器(推薦搭配調整頁面顯示的腳本)
  8. // @description:en Remove annoying elements, allowing users to add their own element selectors (recommended to use with scripts that adjust page display)
  9. // @description:ja 目障りなものを取り除き、ユーザーが自分の要素セレクタを追加できるようにする(ページ表示を調整するスクリプトと併用推奨)
  10. // @description:ko 거슬리는 요소를 제거하고 사용자가 자신의 요소 선택기를 추가할 수 있도록 합니다(페이지 표시를 조정하는 스크립트와 함께 사용하는 것을 권장합니다)
  11. // @description:de Entfernt störende Elemente und ermöglicht es Benutzern, ihre eigenen Elementselektoren hinzuzufügen (empfohlen für die Verwendung mit Skripten, die die Seitendarstellung anpassen)
  12. // @namespace https://github.com/Max46656
  13. // @match *://*/*
  14. // @version 1.1.0
  15. // @author Max
  16. // @icon https://cdn-icons-png.flaticon.com/512/867/867787.png
  17. // @grant GM_registerMenuCommand
  18. // @grant GM.getValue
  19. // @grant GM.setValue
  20. // @grant GM.deleteValue
  21. // @license MPL2.0
  22. // ==/UserScript==
  23.  
  24. class ElementHider {
  25. constructor(selectors) {
  26. this.selectors = selectors;
  27. }
  28.  
  29. hideElements() {
  30. this.selectors.forEach(selector => {
  31. const elements = document.querySelectorAll(selector);
  32. elements.forEach(element => {
  33. element.style.display = 'none';
  34. });
  35. });
  36. }
  37. }
  38.  
  39. class DomainStrategy {
  40. constructor() {
  41. this.regexSelectorsMap = {};
  42. }
  43.  
  44. async loadSelectors() {
  45. this.regexSelectorsMap = await GM.getValue('regexSelectorsMap', {});
  46. }
  47.  
  48. async saveSelectors() {
  49. await GM.setValue('regexSelectorsMap', this.regexSelectorsMap);
  50. }
  51.  
  52. getSelectorsForUrl(url) {
  53. for (const [regexStr, selectors] of Object.entries(this.regexSelectorsMap)) {
  54. const regex = new RegExp(regexStr);
  55. if (regex.test(url)) {
  56. return selectors;
  57. }
  58. }
  59. return [];
  60. }
  61.  
  62. addSelectorToRegex(regexStr, selector) {
  63. if (!this.regexSelectorsMap[regexStr]) {
  64. this.regexSelectorsMap[regexStr] = [];
  65. }
  66. this.regexSelectorsMap[regexStr].push(selector);
  67. this.saveSelectors();
  68. }
  69.  
  70. removeSelectorFromRegex(regexStr, selector) {
  71. if (this.regexSelectorsMap[regexStr]) {
  72. this.regexSelectorsMap[regexStr] = this.regexSelectorsMap[regexStr].filter(item => item !== selector);
  73. if (this.regexSelectorsMap[regexStr].length === 0) {
  74. delete this.regexSelectorsMap[regexStr];
  75. }
  76. this.saveSelectors();
  77. }
  78. }
  79.  
  80. getAllRegexes() {
  81. return Object.keys(this.regexSelectorsMap);
  82. }
  83. }
  84.  
  85. class MenuManager {
  86. constructor(strategy) {
  87. this.strategy = strategy;
  88. this.initMenu();
  89. }
  90.  
  91. getMenuLabels() {
  92. const userLang = navigator.language || navigator.userLanguage;
  93. const labels = {
  94. 'zh-TW': {
  95. viewAndAdd: '檢視並新增選擇器',
  96. viewAndRemove: '檢視並刪除選擇器',
  97. showAllRegexes: '顯示所有正則表達式',
  98. enterRegex: '輸入正則表達式:',
  99. currentSelectors: '當前選擇器:',
  100. enterNewSelector: '輸入新的選擇器:',
  101. enterSelectorToDelete: '輸入要刪除的選擇器:',
  102. savedRegexes: '已儲存的正則表達式:',
  103. enterRegexToView: '輸入要檢視的正則表達式:'
  104. },
  105. 'en': {
  106. viewAndAdd: 'View and Add Selectors',
  107. viewAndRemove: 'View and Remove Selectors',
  108. showAllRegexes: 'Show All Regexes',
  109. enterRegex: 'Enter the regex:',
  110. currentSelectors: 'Current selectors:',
  111. enterNewSelector: 'Enter the new selector:',
  112. enterSelectorToDelete: 'Enter the selector to delete:',
  113. savedRegexes: 'Saved regexes:',
  114. enterRegexToView: 'Enter the regex to view:'
  115. },
  116. 'ja': {
  117. viewAndAdd: 'セレクターを表示して追加',
  118. viewAndRemove: 'セレクターを表示して削除',
  119. showAllRegexes: 'すべての正則表現を表示',
  120. enterRegex: '正則表現を入力してください:',
  121. currentSelectors: '現在のセレクター:',
  122. enterNewSelector: '新しいセレクターを入力してください:',
  123. enterSelectorToDelete: '削除するセレクターを入力してください:',
  124. savedRegexes: '保存された正則表現:',
  125. enterRegexToView: '表示する正則表現を入力してください:'
  126. }
  127. };
  128.  
  129. // 回傳對應語言的選單文字,若使用者的語言不在支援列表中,回傳英文
  130. return labels[userLang] || labels['en'];
  131. }
  132.  
  133. async initMenu() {
  134. await this.strategy.loadSelectors();
  135.  
  136. const labels = this.getMenuLabels();
  137.  
  138. GM_registerMenuCommand(labels.viewAndAdd, this.viewAndAddSelectors.bind(this));
  139. GM_registerMenuCommand(labels.viewAndRemove, this.viewAndDeleteSelectors.bind(this));
  140. GM_registerMenuCommand(labels.showAllRegexes, this.showAllRegexes.bind(this));
  141. }
  142.  
  143. async viewAndAddSelectors() {
  144. const labels = this.getMenuLabels();
  145. const regexStr = prompt(labels.enterRegex, window.location.hostname + "/*");
  146. if (regexStr) {
  147. const currentSelectors = this.strategy.getSelectorsForUrl(regexStr);
  148. alert(`${labels.currentSelectors}\n${currentSelectors.join('\n')}`);
  149. const newSelector = prompt(labels.enterNewSelector);
  150. if (newSelector) {
  151. this.strategy.addSelectorToRegex(regexStr, newSelector);
  152. alert(`Added selector: ${newSelector}`);
  153. }
  154. }
  155. }
  156.  
  157. async viewAndDeleteSelectors() {
  158. const labels = this.getMenuLabels();
  159. const regexStr = prompt(labels.enterRegex, window.location.hostname + "/*");
  160. if (regexStr) {
  161. const currentSelectors = this.strategy.getSelectorsForUrl(regexStr);
  162. alert(`${labels.currentSelectors}\n${currentSelectors.join('\n')}`);
  163. const selectorToDelete = prompt(labels.enterSelectorToDelete);
  164. if (selectorToDelete) {
  165. this.strategy.removeSelectorFromRegex(regexStr, selectorToDelete);
  166. alert(`Deleted selector: ${selectorToDelete}`);
  167. }
  168. }
  169. }
  170.  
  171. async showAllRegexes() {
  172. const labels = this.getMenuLabels();
  173. const allRegexes = this.strategy.getAllRegexes();
  174. const regexStr = prompt(`${labels.savedRegexes}\n${allRegexes.join('\n')}\n\n${labels.enterRegexToView}`);
  175. if (regexStr) {
  176. const selectors = this.strategy.getSelectorsForUrl(regexStr);
  177. alert(`Selectors for regex ${regexStr}:\n${selectors.join('\n')}`);
  178. }
  179. }
  180. }
  181.  
  182. async function main() {
  183. const strategy = new DomainStrategy();
  184. await strategy.loadSelectors();
  185.  
  186. const currentUrl = window.location.href;
  187. const selectors = strategy.getSelectorsForUrl(currentUrl);
  188.  
  189. if (selectors.length > 0) {
  190. const hider = new ElementHider(selectors);
  191. hider.hideElements();
  192. }
  193.  
  194. new MenuManager(strategy);
  195. }
  196.  
  197. main();

QingJ © 2025

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