// ==UserScript== // @name 나무위키 광고 삭제 // @namespace Violentmonkey Scripts // @icon https://t2.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=http://namu.wiki // @match https://namu.wiki/* // @grant none // @version 1.22 // @author Xlbatross // @run-at document-end // @description 일단 모바일에서도 되는 것 같아요; // @downloadURL none // ==/UserScript== // MutationObserver 설정 const targetNode = this.document.body; const config = { childList: true, subtree: true }; const observer = new MutationObserver(mutations => { mutations.forEach(() => { let parent; const queryId = document.querySelector('[data-google-query-id]'); parent = queryId; while (parent && parent.parentElement.children.length == 1) { let oldParent = parent; parent = parent.parentElement; if (!parent) { parent = oldParent; break; } } parent?.remove(); // Power Link const powerLinkImg = document.querySelector('img[src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PC9zdmc+"]'); parent = powerLinkImg; // powerLink table 검색 while (parent && parent.tagName != 'TABLE') { parent = parent.parentElement; } if (parent) { // table 위의 parent와 그 위 parent를 확인. let table = parent; let topParent = table.parentElement.parentElement; parent = table.parentElement; // table 삭제 table?.remove(); // 삭제 후 parent에 a element 확인 let linkElement = parent.querySelector('a[href]'); if (!linkElement) { parent?.remove(); linkElement = topParent.querySelector('a[href]'); if (!linkElement) { topParent?.remove(); } } } }); }); // 초기 로드 시 MutationObserver 연결 observer.observe(targetNode, config);